4

私はこのようなことをしようとしています:

- (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 など) を設定することは決してありません...

4

1 に答える 1

1

あなたの優先度は 500 であることに気付きました。これは、他の制約を満たすために、この制約を破っても構わないと思っていることを意味します。他にどのような制約があるのだろうか。Interface Builder でこれを行う場合、あいまいさを排除するために必要と思われる制約を追加するという厄介な傾向があります (少なくとも Xcode 4.6.x では)。他の高さの制約、または優先される上下の制約がないことを確認することをお勧めします。

要するに、を設定するためのあなたのテクニックは問題ありconstantません(考えて、使用するだけsetNeedsLayoutで十分だと思います)。問題はおそらく、長引く可能性のある他の制約にあります。

この制約の優先度を 1000 に変更すると、競合する制約がある場合、それらが何であるかに関するエラーが表示され、問題の診断に役立ちます。しかし、そのままでは、この高さの制約が無視されて、競合する他の制約 (優先順位が高いか等しい) を優先しても問題ないことを autolayout に伝えています。優先度を 1000 に設定することで、この制約を無視したくないということになります。

于 2013-06-28T17:52:23.780 に答える