Birden çok paragraf içeren metin içeren tableView hücreleri almaya çalışıyordum. İlişkilendirilen dizeler, paragraflar arasında fazladan boşluk elde etmenin bir yolu gibi görünüyordu (dizede iki satır besleme yapmaktan biraz daha hoş görünen bir şey). Hücreye farklı bir metin koymak istediğinizde IB ayarlarının çalışma zamanında uygulanmadığını keşfettiğimde bu ve diğer gönderilere rastladım.
Bulduğum en önemli şey, belirli özelliklere sahip atfedilmiş bir dize oluşturmak için String'e bir uzantı eklemekti (Swift kullanarak). Buradaki örnek, Helvetica'dan kolayca ayırt edilebildiği için Marker Felt yazı tipini kullanır. Örnek ayrıca paragrafları birbirinden daha farklı kılmak için biraz fazladan boşluk gösterir.
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
}
}
Daha sonra, benim özel tableViewCell'imde, ona istediğiniz metni gönderiyorsunuz ve onu UILabel'de ilişkilendirilmiş bir dizeye dönüştürüyor.
// MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
myLabel.attributedText = inputString.toMarkerFelt()
}}
TableView ile görünüm denetleyicisinde, hücrenizi viewDidLoad () 'a kaydetmelisiniz - Ben bir uç kullandım, yani şöyle bir şey:
let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)
Hücrenin ne kadar uzun olması gerektiğini anlamasını sağlamak için, boyut bilgisi almak için kullanılan ve hiçbir zaman tableView'e eklenmeyen bir prototip hücre yapın. Dolayısıyla, görünüm denetleyicinizin değişkenlerinde:
var prototypeSummaryCell : MarkerFeltCell? = nil
Sonra in (muhtemelen geçersiz kıl - görünüm denetleyicinize bağlı olarak) 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 { // ...
Yukarıdaki kodda, prototypeCell ilk ihtiyaç duyulduğunda doldurulacaktır. PrototypeCell daha sonra otomatikleştirme işleminden geçtikten sonra hücrenin yüksekliğini bulmak için kullanılır. Ceil () işlevi ile yüksekliği yuvarlamanız gerekecektir. Ayrıca bazı ekstra şekerleme faktörü ekledim.
Son kod biti, hücre için metni nasıl yapılandırdığınızdır. Bu örnek için basitçe:
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
}
}
Ayrıca, işte ucun bir fotoğrafı. Etiketi hücrenin kenarlarına sabitledi (kenar boşluğu istenecek şekilde), ancak alt sınırlama için "Gerekli" den daha düşük bir önceliğe sahip bir "Büyük veya Eşit" kısıtlaması kullanıldı.
Etiketin yazı tipini Attributed olarak ayarlayın. Gerçek IB yazı tipi önemli değildi.
Bu durumda sonuç: