Có rất nhiều thông tin tốt về SO và elsewhere về cách tính chiều cao cần thiết cho hàng UITableView tùy thuộc vào kích thước của một chế độ xem phụ. Ví dụ điển hình và ví dụ tôi đang áp dụng ở đây là ô có chứa nhãn có văn bản có độ dài thay đổi.Nhãn độ dài biến đổi, chiều cao hàng bảng, và bố cục tự động
Lời khuyên thông thường là sử dụng sizeWithFont:constrainedToSize:lineBreakMode:
trong tableview của heightForRowAtIndexPath:
. Nhưng hầu hết các ví dụ tôi đã nhìn thấy sử dụng một số 'ma thuật' dựa trên chiều rộng đã biết của nhãn.
CGSize constraint = CGSizeMake(224.0, MAXFLOAT); //224 is known to be the width available
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];
Một số ví dụ tốt hơn có thể sử dụng giới hạn của tableview, và sau đó trừ đi con số ma thuật hoặc hằng số cho các quan điểm khác trong tế bào, trong đó có ít nhất một chút rõ ràng hơn (và hoạt động tốt hơn nếu các giới hạn thay đổi trên xoay vv) .
CGSize constraint = CGSizeMake(self.tableview.bounds.size.width - 20 - 10 - 36 - 20, MAXFLOAT); //each non-label width subtracted
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];
Đây là cách tiếp cận chung nhưng có vẻ như thiếu. Ai có thể nói độ rộng của các bản xem trước ô khác và thậm chí là phông chữ, được đảm bảo không thay đổi (hoặc sẽ luôn được thay đổi một cách siêng năng ở cả hai nơi)?
Tôi quyết định thay vì có ô chịu trách nhiệm cung cấp chiều cao này. Các tế bào luôn luôn biết thuộc tính của nó. Để thực hiện điều này, trước hết tôi đã tạo tất cả mã bố cục của mình trong ô tham chiếu đến một số hằng số cục bộ. Sau đó tôi đã thêm một phương thức lớp vào lớp ô tùy chỉnh của mình, có thể trả về chiều cao bắt buộc cho bất kỳ phần văn bản nào, dựa trên các hằng số phông chữ và kích thước của riêng nó.
+ (CGFloat)heightRequiredForText:(NSString *)text usingWidth:(CGFloat)width
{
//a class method that tells the caller how much height is needed for the provided text, based on the cell's size and font constants
CGSize constraintSize = CGSizeMake(width - kMargin - kGap - kMargin - kCheckboxWidth, MAXFLOAT);
CGRect bounds = [text boundingRectWithSize:constraintSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:self.labelFont}
context:nil];
return bounds.size.height;
}
Điều này cho phép UITableViewController chỉ đơn giản cung cấp văn bản và chiều rộng giới hạn hiện tại, (nghĩa là chiều rộng của bảng nhìn). Phông chữ và bố cục có thể được thay đổi trong lớp con của ô và mọi thứ vẫn tiếp tục 'chỉ hoạt động'.
Câu hỏi 1
Cũng giống như một mặt lưu ý, là thế này chăng? Có cách nào tốt hơn để đạt được điều tương tự không?
Câu hỏi 2
Dưới đây là vấn đề chính tôi đang gặp khó với điều này (và các tiêu chuẩn khác) tiếp cận. Khi ô ở chế độ chỉnh sửa, chiều rộng của nhãn sẽ thay đổi để phù hợp với các phụ kiện chỉnh sửa. Vì chiều cao hàng là không đổi và nhãn đang sử dụng bố cục tự động, chiều cao của nó tăng lên.
Các hành vi yêu cầu là cho chiều cao của nhãn duy trì liên tục và cắt ngắn nên được sử dụng khi cần thiết.
Tôi có thể triển khai địa chỉ này ở đâu và như thế nào? Tôi có nên làm gì đó trong setEditing của tế bào không? Có thể thêm một hạn chế khác để hạn chế chiều cao và bật cắt bớt, với điều kiện ngược lại được áp dụng khi chỉnh sửa == NO? Điều gì về mẫu 'vuốt để xóa' - Tôi không nghĩ rằng trình kích hoạt này được thiết lậpChỉnh sửa? Điều gì về layoutSubview - tôi có thể làm điều gì đó trong đó?
Cách tiếp cận tôi khuyên là sử dụng [trường hợp tế bào nguyên mẫu] (http://stackoverflow.com/questions/13660004/retrieve-custom -prototype-cell-height-from-storyboard/14127936 # 14127936) cho loại điều này. –