修复了屏幕底部的 UIView 会忽略 NSLayoutConstraint 的变化

Posted

技术标签:

【中文标题】修复了屏幕底部的 UIView 会忽略 NSLayoutConstraint 的变化【英文标题】:Fixed UIView at bottom of the screen ignores NSLayoutConstraint changes 【发布时间】:2014-08-08 00:12:46 【问题描述】:

我在使用 Xcode5 的自动布局视图中遇到了这种奇怪的行为。

我将UIView 固定在屏幕底部,点击按钮后,我将bottom:0 约束更新为bottom:-60,这有效地将其移出可见屏幕。只要此 UIView 没有任何子视图,此动画就可以正常工作。

现在,我在这个 UIView 里面添加了两个UIButtons 和设置触发的动画

[self.bottomConstraint setConstant:-60];

被简单地忽略。视图及其两个 UIButton 子视图仍然可见,就好像 self.bottomConstraint.constant 仍然是 0

我认为这可能与translatedAutoresizingMasksToConstraints 有关,所以我将其设置为NO。没有成功...想法我可能做错了什么?

谢谢!

【问题讨论】:

【参考方案1】:

在您更改约束的常量后,在您的主视图(您在问题中引用的第一个 UIView 的超级视图)上调用此方法:

[mainView setNeedsLayout];

【讨论】:

【参考方案2】:

如果您需要在更新约束后为布局更改设置动画,则需要在动画块中调用 layoutIfNeeded。

看起来像这样:

[self.bottomConstraint setConstant:-60];
[UIView animateWithDuration:0.2 animations:^
    [view layoutIfNeeded]; // view is the UIView that contains your button
];

layoutIfNeeded 布局视图层次结构中的子视图,从您立即调用该方法的那个开始。 setNeedsLayout 只是将视图标记为在下一个布局周期刷新其布局。

【讨论】:

以上是关于修复了屏幕底部的 UIView 会忽略 NSLayoutConstraint 的变化的主要内容,如果未能解决你的问题,请参考以下文章

UICollisionBehavior 忽略屏幕边缘

iOS 7 UI 转换问题:屏幕底部的触摸事件被忽略

如何修复表格视图底部的按钮?

动画调整全屏 UIView 的大小以在屏幕底部显示另一个 UIView

修复了 UIView 的高度限制

将自定义 UIView 锚定到相对于屏幕大小的屏幕底部