ฉันพยายามรับเซลล์ 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
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.")
}
}
นอกจากนี้นี่คือช็อตของจะงอย ตรึงป้ายกำกับไว้ที่ขอบของเซลล์ (ด้วยระยะขอบที่ต้องการ) แต่ใช้ข้อ จำกัด "มากกว่าหรือเท่ากัน" โดยมีลำดับความสำคัญน้อยกว่า "จำเป็น" สำหรับข้อ จำกัด ด้านล่าง
ตั้งค่าแบบอักษรของป้ายกำกับเป็น Attributed แบบอักษร IB จริงไม่สำคัญ
ผลลัพธ์ในกรณีนี้: