当兄弟姐妹用自动布局更改时,视图不会重绘

时间:2012-10-02 19:51:48

标签: ios uikit ios6 autolayout

我有一个应用程序,其UI设置如下

V:[statusBarView][contentView][footerView]

虽然我在IB中做了布局(见下文)。 statusBarView和footerView的高度固定,它们的顶部/底部空格(分别)与父视图(VC的视图)齐平。

在屏幕抓取中,您可以看到当屏幕旋转并且视图重绘时,中间contentView容器及其子视图的大小调整并正确布局。

我对其中一个按钮的操作设置为调整(蓝色)footerView的大小。我的期望,因为约束设置使得contentView的底部等于footerView的顶部,如果我调整页脚大小,contentView将自己处理它的大小调整。这不会发生。无论我是否将footerView设置为更高或更短或向上或向下移动,contentView都保持不变。

我尝试过setNeedsUpdateConstraints,setNeedsLayout等,但它们没有效果。

也许我完全忽略了自动布局的重点,或者只是如何实现它。为什么视图能够在窗口/超级视图发生变化时使布局正确,而不是约束实际依赖的兄弟视图?

由于

Default vertical layout Default horizontal layout

2 个答案:

答案 0 :(得分:0)

当您尝试调整页脚大小时,您只是设置框架,还是更新约束?

您应该能够用新的高度约束替换高度约束(具有更新的高度)。在下面的代码中,我使用这种技术来更改名为_leftNavBar的视图的主要值,该视图直接位于self.view中。您应该能够非常轻松地修改它以找到高度约束,并在其上设置新值。

[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];

答案 1 :(得分:0)

定义IBOutlet以引用页脚的高度约束。 更改它的值时,它也应该更改内容视图的高度。