当兄弟姐妹随自动布局发生变化时,视图不会重绘
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 以引用页脚的高度约束。 当改变它的值时,它也应该改变内容视图的高度。
【讨论】:
以上是关于当兄弟姐妹随自动布局发生变化时,视图不会重绘的主要内容,如果未能解决你的问题,请参考以下文章