UITableView
iOS 8で実行していて、ストーリーボードの制約からセルの自動高さを使用しています。
自分のセルの1つにシングルが含まれていて、UITextView
ユーザー入力に基づいて縮小および拡張する必要があります-テキストを縮小/拡張するにはタップします。
これを行うには、テキストビューにランタイム制約を追加し、ユーザーイベントに応じて制約の定数を変更します。
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
これを行うときはいつでも、tableView
更新でラップして呼び出します[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];
これを行うと、セルが展開します(そして、展開中にアニメーション化します)が、制約の警告が表示されます。
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は計算された高さです。その他の制約は、UITextView
Xcode / IBによるものです。
最後の問題は私を悩ませています- UIView-Encapsulated-Layout-Height
それは最初にレンダリングされたときのセルの計算されたUITextView
高さだと思います-(私は高さを70.0以上に設定しました)しかし、この派生制約がユーザーcnstraintを更新しました。
さらに悪いことに、レイアウトコードは高さの制約を破ろうとしていると示していますが、そうではありません。セルの高さを再計算し、すべてが希望どおりに描画されます。
それで、NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(私はそれが自動セルサイジングのために計算された高さだと思います)とは何ですか、そしてそれをきれいに再計算するよう強制するにはどうすればよいですか?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
。最初に自動サイズ変更マスクを設定すると、最後の制約が追加されなくなると思います。:私はここに、このソリューション見つけgithub.com/wordpress-mobile/WordPress-iOS/commit/...
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
定義に行が欠けていたことで、これはIBのバグであると思いました。。とにかく少なくとも私のものでした。