Tôi đang cố lấy các ô tableView với văn bản có nhiều đoạn văn. Các chuỗi được phân bổ dường như là một cách để có thêm khoảng cách giữa các đoạn văn (một cái gì đó đẹp hơn một chút so với việc thực hiện hai dòng cấp dữ liệu trong chuỗi). Xem qua bài viết này và các bài viết khác khi tôi phát hiện ra rằng cài đặt IB không áp dụng tại thời điểm chạy khi bạn muốn đặt văn bản khác vào ô.
Điều chính tôi nghĩ ra là thêm một phần mở rộng vào String (sử dụng Swift) để tạo một chuỗi được phân bổ với các đặc điểm nhất định. Ví dụ ở đây sử dụng phông chữ Marker Felt, vì nó có thể dễ dàng phân biệt với Helvetica. Ví dụ cũng cho thấy một chút khoảng cách giữa các đoạn văn để làm cho chúng khác biệt với nhau hơn.
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
}
}
Sau đó, trong tableViewCell tùy chỉnh của tôi, bạn gửi cho nó văn bản bạn muốn và nó chuyển đổi nó thành một chuỗi phân bổ trên UILabel.
// MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
myLabel.attributedText = inputString.toMarkerFelt()
}}
Trong bộ điều khiển chế độ xem với tableView, bạn nên đăng ký ô của mình trong viewDidLoad () - Tôi đã sử dụng một nib, vì vậy một cái gì đó như:
let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)
Để giúp ô tìm ra chiều cao của nó, hãy tạo một ô nguyên mẫu dùng để lấy thông tin kích thước và không bao giờ được thêm vào tableView. Vì vậy, trong các biến của bộ điều khiển chế độ xem của bạn:
var prototypeSummaryCell : MarkerFeltCell? = nil
Sau đó, trong (có thể ghi đè - tùy thuộc vào bộ điều khiển chế độ xem của bạn) 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 { // ...
Trong đoạn mã trên, prototypeCell sẽ được điền vào lần đầu tiên nó cần. Sau đó, prototypeCell được sử dụng để tìm ra chiều cao cho ô sau khi trải qua quá trình tự động kích thước. Bạn sẽ cần làm tròn chiều cao bằng hàm ceil (). Tôi cũng đã thêm vào một số yếu tố fudge bổ sung.
Bit mã cuối cùng là cách bạn định cấu hình văn bản cho ô. Đối với ví dụ này, chỉ cần:
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
}
}
Ngoài ra, đây là một shot của ngòi bút. Đã ghim nhãn vào các cạnh của ô (với lề mong muốn), nhưng sử dụng ràng buộc "Lớn hơn hoặc Bằng", với mức ưu tiên nhỏ hơn "Bắt buộc" cho ràng buộc dưới cùng.
Đặt phông chữ của nhãn thành Thuộc tính. Phông chữ IB thực tế không thành vấn đề.
Kết quả trong trường hợp này: