Ich habe versucht, tableView-Zellen mit Text mit mehreren Absätzen abzurufen. Die zugewiesenen Zeichenfolgen schienen eine Möglichkeit zu sein, zusätzlichen Platz zwischen den Absätzen zu schaffen (etwas, das etwas schöner aussieht, als zwei Zeilenvorschübe in der Zeichenfolge auszuführen). Kam über diesen und andere Beiträge, als ich feststellte, dass die IB-Einstellungen zur Laufzeit nicht zutrafen, als Sie anderen Text in die Zelle einfügen wollten.
Die Hauptsache, die ich mir ausgedacht habe, war das Hinzufügen einer Erweiterung zu String (unter Verwendung von Swift), um einen zugeordneten String mit bestimmten Eigenschaften zu erstellen. In diesem Beispiel wird die Markierungsfilzschrift verwendet, da sie leicht von Helvetica zu unterscheiden ist. Das Beispiel zeigt auch einen kleinen zusätzlichen Abstand zwischen Absätzen, um sie voneinander zu unterscheiden.
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
}
}
Dann senden Sie in meiner benutzerdefinierten tableViewCell den gewünschten Text und konvertieren ihn in eine zugeordnete Zeichenfolge auf dem UILabel.
// MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
myLabel.attributedText = inputString.toMarkerFelt()
}}
Im View Controller mit der tableView sollten Sie Ihre Zelle in viewDidLoad () registrieren. Ich habe eine Schreibfeder verwendet, also so etwas wie:
let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)
Um herauszufinden, wie hoch die Zelle sein soll, erstellen Sie eine Prototypzelle, die zum Abrufen von Größeninformationen verwendet wird und niemals zur Tabellenansicht hinzugefügt wird. Also, in den Variablen Ihres View Controllers:
var prototypeSummaryCell : MarkerFeltCell? = nil
Dann in (wahrscheinlich überschreiben - abhängig von Ihrem View Controller) heightForRowAtIndexPath:
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 { // ...
Im obigen Code wird die prototypeCell beim ersten Mal ausgefüllt, wenn sie benötigt wird. Die prototypeCell wird dann verwendet, um die Höhe der Zelle nach dem automatischen Größenänderungsprozess zu ermitteln. Sie müssen die Höhe mit der Funktion decken () aufrunden. Ich habe auch einen zusätzlichen Fudge-Faktor hinzugefügt.
Das letzte Codebit gibt an, wie Sie den Text für die Zelle konfigurieren. Für dieses Beispiel einfach:
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
}
}
Hier ist auch eine Aufnahme der Feder. Fixierte die Beschriftung an den Rändern der Zelle (mit dem gewünschten Rand), verwendete jedoch eine Einschränkung "Größer als oder gleich" mit einer Priorität von weniger als "Erforderlich" für die untere Einschränkung.
Stellen Sie die Schriftart des Etiketts auf Attributed ein. Die tatsächliche IB-Schriftart spielte keine Rolle.
Das Ergebnis in diesem Fall: