Tôi có UITableView
chạy trên iOS 8 và tôi đang sử dụng chiều cao di động tự động từ các ràng buộc trong bảng phân cảnh.
Một trong các ô của tôi chứa một ô duy nhất UITextView
và tôi cần nó để hợp đồng và mở rộng dựa trên đầu vào của người dùng - nhấn để thu nhỏ / mở rộng văn bản.
Tôi đang làm điều này bằng cách thêm một ràng buộc thời gian chạy vào chế độ xem văn bản và thay đổi hằng số trên ràng buộc để đáp ứng với các sự kiện của người dùng:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Khi tôi làm điều này, tôi gói nó trong các tableView
bản cập nhật và gọi [tableView setNeedsUpdateConstraints]
:
[tableView beginUpdates];
[_briefCell collapse:!_showFullBriefText];
[tableView setNeedsUpdateConstraints];
// I have also tried
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.
[tableView endUpdates];
Khi tôi làm điều này, tế bào của tôi sẽ mở rộng (và hoạt hình trong khi thực hiện nó) nhưng tôi nhận được một cảnh báo ràng buộc:
2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",
"<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-| (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'] (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>
388 là chiều cao tính toán của tôi, các ràng buộc khác trên UITextView
là của tôi từ Xcode / IB.
Cái cuối cùng làm phiền tôi - Tôi đoán đó UIView-Encapsulated-Layout-Height
là chiều cao tính toán của ô khi nó được hiển thị lần đầu tiên - (Tôi đặt UITextView
chiều cao của mình là> = 70.0) tuy nhiên có vẻ không đúng khi ràng buộc xuất phát này ghi đè lên cập nhật người dùng cnstraint.
Tồi tệ hơn, mặc dù mã bố cục nói rằng nó đang cố gắng phá vỡ giới hạn chiều cao của tôi, nhưng nó không - nó tiếp tục tính toán lại chiều cao của tế bào và mọi thứ rút ra như tôi muốn.
Vậy, đó là gì NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(tôi đoán đó là chiều cao được tính cho kích thước ô tự động) và tôi nên làm thế nào để buộc nó phải tính toán lại một cách sạch sẽ?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Tôi nghĩ rằng việc thiết lập mặt nạ tự động kích hoạt ban đầu sẽ ngăn chặn các ràng buộc cuối cùng được thêm vào. Tôi đã tìm thấy giải pháp này tại đây: github.com/wordpress-mobile/WordPress-iOS/commit/ mẹo
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
trong định nghĩa của nó, khiến tôi tin rằng đây là lỗi IB . Ít nhất là của tôi dù sao đi nữa.