6

Tôi đang xây dựng một UITableView với các ô bảng tùy chỉnh chiều cao thay đổi, chiều cao của chúng được xác định bởi kích thước của UILabel nhiều dòng chứa. Tôi đã có phương thức ủy quyền tableView:heightForRowAtIndexPath: được kết nối và tính chiều cao cuối cùng chính xác bằng cách sử dụng sizeWithFont:constrainedToSize:.Chiều cao khung UITableViewCell không phù hợp với bảngView: heightForRowAtIndexPath:

Tôi gặp vấn đề lạ: vào thời điểm phương thức nguồn dữ liệu được gọi là chiều cao chính xác cho mỗi hàng đã được xác định như mô tả ở trên, nhưng khung của ô không khớp với chiều cao đó. Thay vào đó, thuộc tính frame.size.height của ô là chiều cao ô mặc định của chế độ xem bảng (86 px, như tôi đã đặt trong Trình tạo giao diện, chiều cao chính xác khi UILabel chứa chỉ một dòng văn bản), thay vì là chiều cao tableView:heightForRowAtIndexPath: được xác định chính xác cho đường dẫn chỉ mục đó.

Tôi đang sản xuất các tế bào trong cellForRowAtIndexPath: sử dụng dequeuing, có nghĩa là,

// Using storyboards, this never returns nil, no need to check for it 
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"]; 
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel 

Có vẻ như, sau đó, rằng bất cứ iOS đang làm đằng sau hậu trường, các dequeuing không thiết lập thuộc tính khung của tế bào để phù hợp với chiều cao được tính toán. Điều này trong chính nó không phải là đáng ngạc nhiên, dequeuing mối quan tâm chính nó với các trường hợp tế bào, không phải hình học của họ. Tuy nhiên, các ô được hiển thị chính xác, vì vậy thuộc tính chiều cao đang được đặt ở đâu đó, nhưng nó xảy ra sau cellForRowAtIndexPath:.

Vì vậy: khi ban đầu tôi điền chế độ xem bảng, cell.frame.size.height là 86 cho tất cả các ô khi chúng xuất hiện lần đầu tiên khi tôi cuộn danh sách xuống dưới. Vì hình dạng chính xác được đặt đôi khi sau cellForRowAtIndexPath: đầu tiên cho mỗi hàng trước khi nó được hiển thị, khi tôi cuộn lên trở lại, thuộc tính chiều cao là chính xác cho từng ô trở lại chế độ xem sau khi được sử dụng lại.

Sau này, tôi có thể cuộn chế độ xem bảng qua lại theo ý muốn và thuộc tính chiều cao vẫn chính xác cho mỗi ô từ điểm đó trở đi.

Cách chính xác để nhận được chiều cao ô chính xác vào lần đầu tiên, trước khi sử dụng lại dequeue dựa trên cơ sở nào? Tôi cần điều này để làm một chút định vị lại của các bản xem trước của ô bảng. Tôi có cần phải tự gọi heightForRowAtIndexPath: trong cellForRowAtIndexPath: và sau đó đặt thủ công khung của cá thể CustomCell mới được tạo để khớp với chiều cao đó không? Điều này có vẻ dư thừa và tôi cần phải tạo một cơ chế để phát hiện khi ô được tạo lần đầu tiên với chiều cao khung sai so với khi nó được dequeued với chiều cao khung chính xác sau này để tránh dư thừa này.

Vì vậy, nếu ai đó có thể làm sáng tỏ những gì logic đằng sau điều này, tôi sẽ đánh giá cao nó.

Trả lời

6

Theo đề xuất của Flexo, việc trả lời chính bản thân mình dường như tốt hơn là thêm bản chỉnh sửa cho câu hỏi. Vì vậy, đây là chỉnh sửa trước đó làm câu trả lời:


Không sao, tôi nên đọc tài liệu tốt hơn. Tôi có thể có được khung chính xác theo phương pháp tableView:willDisplayCell:forRowAtIndexPath: của UITableViewDelegate, vì vậy đó là vị trí chính xác để tùy chỉnh chế độ xem phụ dựa trên khung chính xác được đặt, chứ không phải là cellForRowAtIndexPath:.

Thú vị rằng các tài liệu nói điều này, mặc dù:

Sau delegate lợi nhuận, quan điểm bảng bộ chỉ alphaframe tài sản, và sau đó chỉ khi hiệu ứng động hàng khi họ trượt trong hoặc ra ngoài.

... vì khung chính xác đã có khi phương thức đại biểu này được gọi. Nhưng dù sao, vấn đề đã được giải quyết.

+0

câu hỏi đầu tiên thực sự tốt, nhưng câu trả lời này không phải là rất tốt. quan tâm để chia sẻ cách bạn khắc phục sự cố? – botbot

0

Đừng quên rằng ô là UIView, vì vậy ghi đè layoutSubviews cũng là một cách hợp lệ để có khung chính xác và điều chỉnh kích thước/vị trí của các bản xem trước. Chỉ cần đừng quên gọi số [super layoutSubviews].

0

Cách dễ nhất tôi tìm thấy chỉ là gọi cell.layoutIfNeeded() trước khi bạn thực hiện bất kỳ thiết lập nào trên ô. Điều này đảm bảo tất cả các ràng buộc bố trí được tính toán và các khung được thiết lập.

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