私はこのようなことをしようとしています:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"%@", self.tableViewHeight);
self.tableViewHeight.constant = 0;
NSLog(@"%@", self.tableViewHeight);
[self.tableView setNeedsUpdateConstraints];
[self.tableView setNeedsLayout];
[self.view setNeedsUpdateConstraints];
[self.view setNeedsLayout];
}
しかし、これが機能する場合と機能しない場合があります。ログには常に正しいメッセージが表示されます。
<NSLayoutConstraint:0x9ebe7a0 V:[UITableView:0xa345a00(304@500)] priority:500>
<NSLayoutConstraint:0x9ebe7a0 V:[UITableView:0xa345a00(0@500)] priority:500>
なぜこれが起こるのですか?UIが表示される前にNSLayoutConstraintsプロパティを変更するには?
アップデート:
このコードは 20 回のうち 20 回動作します (ただし、今は常に考えています)。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
dispatch_async(dispatch_get_main_queue(), ^{
self.tableViewHeight.constant = 0;
[self.view setNeedsUpdateConstraints];
});
}
なぜこれが本当に起こるのか教えてください。
更新 2:
以前のコードはまだ機能していないように見えますが、これは機能します:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.topViewHeight.constant += self.tableViewHeight.constant;
self.tableViewHeight.constant = 0;
[self.view setNeedsUpdateConstraints];
}
更新 3:
接続されたビューを持ついくつかの制約に等しい優先度 (500 など) を設定することは決してありません...