Saya mencoba mendapatkan sel tableView dengan teks yang memiliki banyak paragraf. String yang diatribusikan tampaknya menjadi cara untuk mendapatkan spasi ekstra di antara paragraf (sesuatu yang terlihat sedikit lebih bagus daripada melakukan dua baris-feed dalam string). Menemukan ini dan posting lainnya ketika saya menemukan bahwa pengaturan IB tidak berlaku pada waktu proses ketika Anda ingin meletakkan teks yang berbeda di sel.
Hal utama yang saya temukan adalah menambahkan ekstensi ke String (menggunakan Swift) untuk membuat string yang dikaitkan dengan karakteristik tertentu. Contoh di sini menggunakan font Marker Felt, karena mudah dibedakan dari Helvetica. Contoh ini juga menunjukkan sedikit spasi ekstra di antara paragraf agar lebih berbeda satu sama lain.
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
}
}
Kemudian, di tableViewCell kustom saya, Anda mengirimkannya teks yang Anda inginkan dan mengubahnya menjadi string yang diatribusikan pada UILabel.
// MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
myLabel.attributedText = inputString.toMarkerFelt()
}}
Dalam pengontrol tampilan dengan tableView, Anda harus mendaftarkan sel Anda di viewDidLoad () - Saya menggunakan ujung pena, jadi seperti ini:
let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)
Untuk mendapatkan sel untuk mengetahui seberapa tinggi seharusnya, buat sel prototipe yang digunakan untuk mendapatkan info ukuran, dan tidak pernah ditambahkan ke tableView. Jadi, dalam variabel pengontrol tampilan Anda:
var prototypeSummaryCell : MarkerFeltCell? = nil
Kemudian di (mungkin menimpa - bergantung pada pengontrol tampilan Anda) 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 { // ...
Pada kode di atas, prototypeCell akan diisi saat pertama kali dibutuhkan. PrototypeCell kemudian digunakan untuk mengetahui ketinggian sel setelah melalui proses autosizing. Anda perlu membulatkan ketinggian dengan fungsi ceil (). Saya juga menambahkan beberapa faktor fudge ekstra.
Bit kode terakhir adalah bagaimana Anda mengonfigurasi teks untuk sel. Untuk contoh ini, cukup:
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
}
}
Juga, ini bidikan ujung pena. Menyematkan label ke tepi sel (dengan margin yang diinginkan), tetapi menggunakan batasan "Lebih Besar Dari atau Sama dengan", dengan prioritas kurang dari "Wajib" untuk batasan bawah.
Setel font label ke Dikaitkan. Font IB sebenarnya tidak masalah.
Hasil dalam kasus ini: