Saya memiliki UITableView
menjalankan di bawah iOS 8 dan saya menggunakan ketinggian sel otomatis dari kendala di storyboard.
Salah satu sel saya berisi satu UITextView
dan saya membutuhkannya untuk berkontraksi dan berkembang berdasarkan input pengguna - ketuk untuk mengecilkan / perluas teks.
Saya melakukan ini dengan menambahkan kendala runtime ke tampilan teks dan mengubah konstanta pada kendala sebagai respons terhadap peristiwa pengguna:
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
Setiap kali saya melakukan ini, saya membungkusnya dalam tableView
pembaruan dan menelepon [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];
Ketika saya melakukan ini, sel saya berkembang (dan menjiwai saat melakukannya) tapi saya mendapat peringatan kendala:
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 adalah tinggi saya yang dihitung, kendala lain pada UITextView
adalah milik saya dari Xcode / IB.
Yang terakhir mengganggu saya - saya menduga itu UIView-Encapsulated-Layout-Height
adalah tinggi sel yang dihitung saat pertama kali diberikan - (saya menetapkan UITextView
tinggi badan saya menjadi> = 70,0) namun sepertinya tidak benar bahwa batasan turunan ini kemudian mengesampingkan suatu pembaruan cnstraint pengguna.
Lebih buruk lagi, meskipun kode tata letak mengatakan itu mencoba untuk memecahkan batasan ketinggian saya, itu tidak - ia melanjutkan untuk menghitung ulang tinggi sel dan semuanya menarik seperti yang saya inginkan.
Jadi, apa itu NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(saya menduga itu adalah tinggi yang dihitung untuk ukuran sel otomatis) dan bagaimana saya harus memaksanya untuk menghitung ulang secara bersih?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. Saya pikir bahwa pengaturan awal topeng autoresize menghentikan kendala terakhir yang ditambahkan. Saya menemukan solusi ini di sini: github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
dengan definisi, membuat saya percaya bahwa ini adalah bug IB . Setidaknya milikku toh.