2013-08-20 30 views
5

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

enter image description here

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.

enter image description here

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 đó?

+0

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. –

Trả lời

1

Tôi đã thử nhiều thứ - gần nhất tôi đã ghi đè bố cụcSubviews, kiểm tra xem người dùng đã chuyển sang chế độ chỉnh sửa hay chưa và sau đó thêm chiều cao nội tại của nhãn trước rồi thêm ràng buộc tạm thời để thực thi sau đó bị xóa khi thoát khỏi chế độ chỉnh sửa). Nó hoạt động tốt ngoại trừ một vài trường hợp cạnh.

Nhưng sau đó tôi bắt đầu nghĩ về bố cục ô tô một số chi tiết. Tôi đang cố gắng đạt được điều gì? Tôi không muốn nhãn phát triển cao hơn khi chiều rộng của nó bị giảm. Đó là một ràng buộc khá đơn giản:

[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.label 
                    attribute:NSLayoutAttributeHeight 
                    relatedBy:NSLayoutRelationLessThanOrEqual 
                     toItem:self.contentView 
                    attribute:NSLayoutAttributeHeight 
                    multiplier:1 
                    constant:0]]; 

Việc thêm ràng buộc bổ sung này hoạt động tốt. Lưu ý rằng tôi cũng chuyển sang chế độ ngắt dòng để cắt ngắn trên chỉnh sửa:

enter image description here

Các vấn đề liên quan