J'essayais d'obtenir des cellules tableView avec du texte comportant plusieurs paragraphes. Les chaînes attribuées semblaient être un moyen d'obtenir un espace supplémentaire entre les paragraphes (quelque chose d'un peu plus agréable que de faire deux sauts de ligne dans la chaîne). Je suis tombé sur ceci et d'autres articles lorsque j'ai découvert que les paramètres IB ne s'appliquaient pas au moment de l'exécution lorsque vous vouliez mettre un texte différent dans la cellule.
La principale chose que j'ai trouvée a été d'ajouter une extension à String (en utilisant Swift) pour créer une chaîne attribuée avec certaines caractéristiques. L'exemple ici utilise la police Marker Felt, car elle se distingue facilement de Helvetica. L'exemple montre également un petit espacement supplémentaire entre les paragraphes pour les rendre plus distincts les uns des autres.
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
}
}
Ensuite, dans ma tableViewCell personnalisée, vous lui envoyez le texte que vous souhaitez et il le convertit en une chaîne attribuée sur le UILabel.
// MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
myLabel.attributedText = inputString.toMarkerFelt()
}}
Dans le contrôleur de vue avec tableView, vous devez enregistrer votre cellule dans viewDidLoad () - J'ai utilisé une pointe, donc quelque chose comme:
let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)
Pour que la cellule détermine sa hauteur, créez une cellule prototype qui est utilisée pour obtenir des informations sur la taille et qui n'est jamais ajoutée à tableView. Donc, dans les variables de votre contrôleur de vue:
var prototypeSummaryCell : MarkerFeltCell? = nil
Puis dans (probablement remplacer - en fonction de votre contrôleur de vue) 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 { // ...
Dans le code ci-dessus, le prototypeCell sera rempli la première fois qu'il sera nécessaire. Le prototypeCell est ensuite utilisé pour déterminer la hauteur de la cellule après le processus de dimensionnement automatique. Vous devrez arrondir la hauteur avec la fonction ceil (). J'ai également ajouté un facteur de fudge supplémentaire.
Le bit de code final est la façon dont vous configurez le texte de la cellule. Pour cet exemple, simplement:
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
}
}
Aussi, voici une photo de la plume. Épinglé l'étiquette sur les bords de la cellule (avec une marge souhaitée), mais a utilisé une contrainte «Supérieur ou égal», avec une priorité inférieure à «Obligatoire» pour la contrainte inférieure.
Définissez la police de l'étiquette sur Attribuée. La police IB réelle n'avait pas d'importance.
Le résultat dans ce cas: