Bạn đang gặp phải tác dụng phụ của một tính năng mới tuyệt vời trong Tableviews của iOS8: Automatic Row Heights.
Trong iOS 7, bạn có các hàng có kích thước cố định (được đặt bằng tableView.rowHeight
) hoặc bạn sẽ viết mã để tính chiều cao của các ô và bạn sẽ trả lại giá trị đó tableView:heightForRowAtIndexPath
. Viết mã để tính toán chiều cao của ô có thể khá phức tạp nếu bạn có nhiều chế độ xem trong ô của mình và bạn có các chiều cao khác nhau để xem xét ở các kích thước phông chữ khác nhau. Thêm Dynamic Type và quá trình này thật khó khăn.
Trong iOS 8, bạn vẫn có thể làm như trên, nhưng giờ đây iOS có thể xác định chiều cao của các hàng, miễn là bạn đã định cấu hình nội dung ô của mình bằng Bố cục Tự động. Đây là lợi ích to lớn đối với các nhà phát triển, vì khi kích thước phông chữ động thay đổi hoặc người dùng sửa đổi kích thước văn bản bằng Cài đặt trợ năng, giao diện người dùng của bạn có thể thích ứng với kích thước mới. Điều đó cũng có nghĩa là nếu bạn có UILabel có thể có nhiều hàng văn bản, ô của bạn bây giờ có thể phát triển để chứa những hàng đó khi ô cần và thu nhỏ khi không có, vì vậy không có bất kỳ khoảng trắng nào không cần thiết.
Thông báo cảnh báo bạn đang thấy cho bạn biết rằng không có đủ ràng buộc trong ô của bạn để Bố cục Tự động thông báo cho chế độ xem bảng về chiều cao của ô.
Để sử dụng chiều cao ô động, cùng với các kỹ thuật đã được đề cập bởi các áp phích khác, cũng sẽ loại bỏ thông báo này, bạn cần đảm bảo ô của mình có đủ các ràng buộc để liên kết các mục giao diện người dùng với đầu và cuối ô. Nếu bạn đã sử dụng Bố cục Tự động trước đây, có thể bạn đã quen với việc đặt các ràng buộc Trên cùng + Hàng đầu, nhưng chiều cao hàng động cũng yêu cầu các ràng buộc dưới cùng.
Thẻ bố cục hoạt động như thế này, xảy ra ngay lập tức trước khi một ô được hiển thị trên màn hình, theo cách vừa đúng lúc:
Kích thước cho nội dung có kích thước nội tại được tính toán. Điều này bao gồm UILabels và UIImageViews, trong đó kích thước của chúng dựa trên văn bản hoặc UIImages mà chúng chứa, tương ứng. Cả hai chế độ xem này sẽ coi chiều rộng của chúng là một giá trị đã biết (vì bạn đã đặt các ràng buộc cho các cạnh sau / đầu hoặc bạn đặt các chiều rộng rõ ràng hoặc bạn đã sử dụng các ràng buộc ngang để cuối cùng tiết lộ chiều rộng từ bên này sang bên kia). Giả sử một nhãn có một đoạn văn bản ("số dòng" được đặt thành 0 để nó sẽ tự động cuộn lại), nó chỉ có thể có chiều ngang 310 điểm, vì vậy nó được xác định là cao 120pt ở kích thước phông chữ hiện tại.
Giao diện người dùng được bố trí theo các ràng buộc định vị của bạn. Có một ràng buộc ở dưới cùng của nhãn kết nối với lề dưới cùng của ô. Vì nhãn đã phát triển thành chiều cao 120 điểm và vì nó bị ràng buộc với cuối ô bởi ràng buộc, nó phải đẩy ô "xuống" (tăng chiều cao của ô) để đáp ứng ràng buộc có nội dung "dưới cùng của nhãn luôn là khoảng cách tiêu chuẩn từ cuối ô.
Thông báo lỗi bạn đã báo cáo xảy ra nếu thiếu ràng buộc dưới cùng, trong trường hợp đó, không có gì để "đẩy" phần dưới cùng của ô ra khỏi đầu của ô, đó là sự không rõ ràng được báo cáo: không có gì để đẩy từ dưới lên trên cùng, ô sụp đổ. Nhưng Bố cục Tự động cũng phát hiện ra điều đó và quay trở lại sử dụng chiều cao hàng tiêu chuẩn.
Đối với những gì nó đáng giá và chủ yếu là để có một câu trả lời tròn, nếu bạn triển khai độ cao hàng động dựa trên Bố cục Tự động của iOS 8, bạn nên triển khai tableView:estimatedHeightForRowAtIndexPath:
. Phương pháp ước tính đó có thể sử dụng các giá trị thô cho các ô của bạn và nó sẽ được gọi khi chế độ xem bảng được tải ban đầu. Nó giúp UIKit vẽ những thứ như thanh cuộn, không thể vẽ được trừ khi chế độ xem bảng biết nó có thể cuộn qua bao nhiêu nội dung, nhưng không cần kích thước hoàn toàn chính xác, vì nó chỉ là một thanh cuộn. Điều này cho phép việc tính toán chiều cao hàng thực tế được hoãn lại cho đến khi ô cần thiết, điều này ít tốn tính toán hơn và cho phép hiển thị UITableView của bạn nhanh hơn.