1

UIがこのように設定されているアプリがあります

V:[statusBarView][contentView][footerView]

IBでレイアウトを行いましたが(以下を参照)。statusBarView と footerView の高さは固定されており、上部/下部のスペースは (それぞれ) 親ビュー (VC のビュー) と同じ高さです。

画面グラブでは、画面が回転してビューが再描画されると、中央の contentView コンテナーとそのサブビューがサイズ変更され、正しくレイアウトされることがわかります。

これらのボタンの 1 つに対して、(青の) footerView のサイズを変更するように設定されたアクションがあります。私の期待は、contentView の下部が footerView の上部と等しくなるように制約が設定されているため、フッターのサイズを変更すると、contentView が独自にサイズ変更を処理することです。これは起こっていません。footerView を高くしたり短くしたり、上下に移動したりしても、contentView は変更されません。

setNeedsUpdateConstraints、setNeedsLayout などを試しましたが、効果がありません。

おそらく、自動レイアウトの要点、またはそれを実装する方法を完全に見逃しています。ウィンドウ/スーパービューが変更されたときにビューが正しいレイアウトを取得できるのに、制約が実際に依存している兄弟ビューが取得できないのはなぜですか?

ありがとう

デフォルトの垂直レイアウト デフォルトの水平レイアウト

4

2 に答える 2

0

フッターの高さ制約への参照を持つようにIBOutletを定義します。値を変更すると、コンテンツビューの高さも変更する必要があります。

于 2012-12-01T16:52:02.467 に答える
0

フッターのサイズを変更しようとしているとき、フレームを設定しているだけですか、それとも制約を更新していますか?

高さの制約を新しいもの (高さが更新されたもの) に置き換えることができるはずです。以下のコードでは、この手法を使用して、self.view に直接配置されている _leftNavBar というビューの先頭の値を変更しています。高さの制約を見つけて新しい値を設定するために、かなり簡単に変更できるはずです。

[self.view.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *con, NSUInteger idx, BOOL *stop) {
    if ([con.firstItem isEqual:_leftNavBar]
        && [con.secondItem isEqual:self.view]
        && con.firstAttribute == NSLayoutAttributeLeading
        && con.secondAttribute == NSLayoutAttributeLeading) {
        [self.view removeConstraint:con];
    }
}];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_leftNavBar
                                                      attribute:NSLayoutAttributeLeading
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeLeading
                                                     multiplier:1.0f
                                                       constant:(newLeftNavX - self.getLeftNavBarWidth)]];
[self.view setNeedsUpdateConstraints];
于 2012-10-09T19:26:13.887 に答える