当兄弟姐妹随自动布局发生变化时,视图不会重绘

Posted

技术标签:

【中文标题】当兄弟姐妹随自动布局发生变化时,视图不会重绘【英文标题】:Views not redrawing when siblings change with auto layout 【发布时间】:2012-10-02 19:51:48 【问题描述】:

我有一个应用程序的 UI 设置是这样的

V:[statusBarView][contentView][footerView]

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

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

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

我试过setNeedsUpdateConstraints、setNeedsLayout等,但都没有效果。

也许我完全错过了自动布局的要点,或者只是如何实现它。为什么当窗口/超级视图更改时视图能够正确布局,而不是约束实际依赖的兄弟视图?

谢谢

【问题讨论】:

【参考方案1】:

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

您应该能够将高度限制替换为新的限制(具有更新的高度)。在下面的代码中,我使用这种技术来更改名为 _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];

【讨论】:

谢谢,我会试试看效果如何。 顺便说一句,如果你想让它动画:在 [UIView animateWithDuration: :] 块调用 [self.view layoutIfNeeded] 之前,然后在块中执行上面的代码而不使用 setNeedsUpdateConstraints,而不是再次调用 layoutIfNeeded .【参考方案2】:

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

【讨论】:

以上是关于当兄弟姐妹随自动布局发生变化时,视图不会重绘的主要内容,如果未能解决你的问题,请参考以下文章

当我推送一个新的视图控制器时,自动布局高度发生变化

随着窗口变小,OSX 自动布局无法重绘某些控件

重绘和重排

iOS自动布局重置我所有的图像位置

Flutter - 当兄弟姐妹灵活时,扩展不会占用所有可用空间

垂直自动布局子视图