2013-10-14 17 views
7

Tôi có một UITableViewCell với nhãn tùy chỉnh sử dụng AutoLayout. Đó là các ràng buộc được thiết lập với một không gian hàng đầu, cuối, cuối, và trên không đổi cho chế độ xem nội dung. Bộ điều khiển xem bảng mà các ô này xuất hiện ở bên trong một số UISplitViewController. Khi chế độ xem bảng được tải, tôi tính chiều cao của ô bằng cách sử dụng mã sau:tableview: heightForRowAtIndexPath: Kích thước chế độ xem nội dung báo cáo không chính xác với AutoLayout

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
CGFloat height = size.height; 

Chân dung cho phép tôi hiển thị chính xác ô. Đây là một ảnh chụp màn hình của một phần của tế bào:

enter image description here

Tuy nhiên, khi tôi xoay iPad vào cảnh quan, nó không phải là tính toán kích thước chính xác và kết thúc với quá nhiều padding:

enter image description here

Đặt điểm ngắt khi số tableview:heightForRowAtIndexPath: được gọi khi xoay kích thước của chế độ xem nội dung không được báo cáo chính xác. Trong thực tế, nó đang báo cáo kích thước cũ, hẹp hơn của chế độ xem bảng.

Làm cách nào để các ô của tôi đổi kích thước phù hợp với UISplitViewController trên iPad?

+0

Dường như ô của bạn chứa UILabels nhiều dòng. Để có được chiều cao chính xác, các nhãn sẽ cần thuộc tính 'preferredMaxLayoutWidth' được đặt chính xác thành độ rộng có sẵn (có khả năng khác khi thiết bị được xoay). Nếu bạn chưa thấy bài đăng này, hãy xem bài đăng đó cũng như dự án mẫu trên GitHub trong các nhận xét: http://stackoverflow.com/questions/18746929/using-auto-layout-in-uitableview-for-dynamic -cell-layouts-heights – smileyborg

+0

Bạn có tạo thêm mã và đặt bất kỳ điều khiển nào không? Bạn có thể thêm mã của mình ở đây không? –

Trả lời

3

UILabel # preferredMaxLayoutWidth ảnh hưởng đến systemLayoutSizeFittingSize. Ví dụ. Bạn có thể đặt UILabel trên View bằng Interface Builder.

Label Layout

  • Chiều rộng của SuperView là 320px.
  • Ràng buộc không gian ngang của UILabel là 20px.

Trong trường hợp này UILabel # preferredMaxLayoutWidth sẽ được đặt 280px. systemLayoutSizeFittingSize sẽ trả về chiều rộng không quá 320px ngay cả khi frame.width của Superview là 480px.

Một trong các giải pháp là ghi đè phương thức CustomCell # setFrame.

- (void)setFrame:(CGRect)frame { 
    [super setFrame:frame]; 
    _label.preferredMaxLayoutWidth = frame.size.width - 20*2 /*Horizontal Spacing*/; 
} 

Và sau đó bạn cần cập nhật bố cục khi bạn cập nhật nhãn.text.

_customCell.label.text = @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
[_customCell setNeedsLayout]; 
[_customCell layoutIfNeeded]; 
Các vấn đề liên quan