मैं कई पैराग्राफ वाले पाठ के साथ tableView कोशिकाओं को प्राप्त करने की कोशिश कर रहा था। आरोपित तार पैराग्राफ के बीच अतिरिक्त जगह पाने के लिए एक रास्ता लग रहा था (कुछ स्ट्रिंग में दो लाइन-फीड करने की तुलना में थोड़ा अच्छा लग रहा है)। इस और अन्य पोस्ट के दौरान आया जब मुझे पता चला कि जब आप सेल में अलग-अलग टेक्स्ट डालना चाहते थे तो आईबी सेटिंग्स रन टाइम पर लागू नहीं होती थी।
मुख्य बात जो मैं साथ आया था वह कुछ विशेषताओं के साथ एक जिम्मेदार स्ट्रिंग बनाने के लिए स्ट्रिंग (स्विफ्ट का उपयोग करके) के विस्तार को जोड़ रहा था। उदाहरण यहां मार्कर फेल्ट फ़ॉन्ट का उपयोग करता है, क्योंकि यह हेल्वेटिका से आसानी से अलग है। उदाहरण पैराग्राफों के बीच थोड़ा सा अतिरिक्त अंतर दिखाता है ताकि उन्हें एक-दूसरे से अधिक विशिष्ट बनाया जा सके।
extension String {
func toMarkerFelt() -> NSAttributedString {
var style = NSMutableParagraphStyle()
style.paragraphSpacing = 5.0
let markerFontAttributes : [NSObject : AnyObject]? = [
NSFontAttributeName : UIFont(name: "Marker Felt", size: 14.0)!,
NSParagraphStyleAttributeName: style,
NSForegroundColorAttributeName : UIColor.blackColor()
]
let s = NSAttributedString(string: self, attributes: markerFontAttributes)
return s
}
}
फिर, मेरे कस्टम टेबल व्यूसेल में, आप इसे अपने इच्छित पाठ को भेजते हैं और इसे यूआईबेल पर एक जिम्मेदार स्ट्रिंग में परिवर्तित कर देता है।
// MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
myLabel.attributedText = inputString.toMarkerFelt()
}}
तालिका दृश्य के साथ दृश्य नियंत्रक में, आपको अपने सेल को दृश्यडालडैड () में पंजीकृत करना चाहिए - मैंने एक निब का उपयोग किया है, इसलिए कुछ इस प्रकार है:
let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)
सेल प्राप्त करने के लिए यह पता लगाने के लिए कि यह कितना लंबा होना चाहिए, एक प्रोटोटाइप सेल बनाएं जिसका उपयोग आकार की जानकारी प्राप्त करने के लिए किया जाता है, और तालिका दृश्य में कभी नहीं जोड़ा जाता है। तो, आपके विचार में नियंत्रक के चर:
var prototypeSummaryCell : MarkerFeltCell? = nil
तब (शायद ओवरराइड - आपके विचार नियंत्रक के आधार पर) ऊँचाई
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
// ...
if xib == "MarkerFeltCell" {
if prototypeCell == nil {
prototypeCell = tableView.dequeueReusableCellWithIdentifier(xib) as? MarkerFeltCell
}
let width : CGFloat = tableView.bounds.width
let height : CGFloat = prototypeCell!.bounds.height
prototypeCell?.bounds = CGRect(x: 0, y: 0, width: width, height: height)
configureCell(prototypeCell!, atIndexPath: indexPath)
prototypeSummaryCell?.layoutIfNeeded()
let size = prototypeSummaryCell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
let nextHeight : CGFloat = ceil(size.height + 1.0)
return nextHeight
} else { // ...
उपरोक्त कोड में, पहली बार आवश्यक होने पर प्रोटोटाइप को भरना होगा। आटोोटाइपिंग प्रक्रिया से गुजरने के बाद प्रोटोटाइप का उपयोग सेल के लिए ऊंचाई का पता लगाने के लिए किया जाता है। आपको छत () फ़ंक्शन के साथ ऊंचाई को गोल करना होगा। मैंने कुछ अतिरिक्त फ्रॉड कारक भी जोड़े।
अंतिम कोड बिट है कि आप सेल के लिए टेक्स्ट को कैसे कॉन्फ़िगर करते हैं। इस उदाहरण के लिए, बस:
func configureCell(cell :UITableViewCell, atIndexPath indexPath: NSIndexPath) {
if let realCell = cell as? MarkerFeltCell {
realCell.configureCellWithString("Multi-line string.\nLine 2.\nLine 3.") // Use \n to separate lines
}
}
इसके अलावा, यहाँ निब का एक शॉट है। सेल के किनारों पर लेबल को पिन किया (मार्जिन वांछित के साथ), लेकिन नीचे की बाधा के लिए "आवश्यक" प्राथमिकता से कम के साथ "ग्रेटर थान या समान" बाधा का उपयोग किया।
लेबल के फ़ॉन्ट को Attributed पर सेट करें। वास्तविक आईबी फ़ॉन्ट से कोई फर्क नहीं पड़ा।
इस मामले में परिणाम: