Я намагався отримати комірки tableView з текстом, що містить кілька абзаців. Атрибутовані рядки, здавалося, є способом отримати додатковий простір між абзацами (щось трохи приємніше виглядає, ніж робити два канали рядків у рядку). Потрапив до цього та інших публікацій, коли я виявив, що параметри IB не застосовуються під час виконання, коли ви хочете вставити інший текст у комірку.
Головне, що я придумав - додати розширення до String (за допомогою Swift), щоб створити атрибутивну рядок з певними характеристиками. У прикладі тут використовується шрифт Marker Felt, оскільки його легко відрізнити від Helvetica. У прикладі також показано трохи додаткового проміжку між абзацами, щоб зробити їх більш чіткими один від одного.
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
}
}
Потім у моїй користувальницькій таблиціViewCell ви надсилаєте йому потрібний текст, і він перетворює його в атрибутивну рядок на UILabel.
// MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
myLabel.attributedText = inputString.toMarkerFelt()
}}
У контролері перегляду з tableView слід зареєструвати свою комірку в viewDidLoad () - я використав ручку, так що:
let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)
Щоб клітина зрозуміла, наскільки вона повинна бути високою, зробіть прототип клітинки, яка використовується для отримання інформації про розмір, і ніколи не додається в tableView. Отже, у змінному контролері вашого перегляду:
var prototypeSummaryCell : MarkerFeltCell? = nil
Потім у (можливо, переосмислення - залежно від контролера перегляду) висотаForForWAtIndexPath:
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 { // ...
У наведеному вище коді прототипCell буде заповнений в перший раз, коли це потрібно. Потім prototypeCell використовується для визначення висоти комірки після проходження процесу автоматизації. Вам потрібно буде округлити висоту за допомогою функції ceil (). Я також додав деякий додатковий коефіцієнт викривлення.
Остаточний біт коду - це те, як ви налаштуєте текст для комірки. Для цього прикладу просто:
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
}
}
Також тут зроблений знімок голівки. Прикріпив мітку до країв комірки (з бажаним запасом), але використовував обмеження "Більше або рівне", з нижчим обмеженням, ніж "Необхідний".
Встановіть шрифт мітки на Атрибутивний. Фактичний шрифт IB не мав значення.
Результат у цьому випадку: