Я пытался получить ячейки 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
}
}
Затем в моем настраиваемом tableViewCell вы отправляете ему нужный текст, и он преобразует его в строку с атрибутами в 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
Затем в (возможно, переопределите - в зависимости от вашего контроллера представления) 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 { // ...
В приведенном выше коде prototypeCell будет заполнен при первой необходимости. Затем 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 не имел значения.
Результат в таком случае: