CGRectOffset 后自动布局不起作用
Posted
技术标签:
【中文标题】CGRectOffset 后自动布局不起作用【英文标题】:AutoLayout not working after CGRectOffset 【发布时间】:2014-12-11 21:19:34 【问题描述】:我有一个名为 containerView
的 UIView。
我将此作为子视图添加到控制器视图的根视图中。我以编程方式为其添加了一些约束(我将其居中并使宽度与父视图的宽度相差几个点)。
我在containerView
中添加了一些UILabel
s 作为子视图。 UILabel
s 的高度决定了containerView
的高度。
当用户点击屏幕时,containerView
会从CGRectOffset()
向上移动,一旦动画完成,它就会移回原来的位置。
CGPoint absolutePoint = self.containterView.frame.origin;
self.containerYConstraint.constant = -absolutePoint;
[UIView
animateWithDuration:0.5
animations:^
[viewForUpdate setNeedsUpdateConstraints];
completion:^(BOOL finished)
self.containerYConstraint.constant = 0;
[viewForUpdate setNeedsUpdateConstraints];
[self.containerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // Remove all subviews
];
我需要删除作为子视图放入的UILabel
s,并用不同的标签替换它们。但是,当我删除 UILabel 中的一个时,整个containerView
就消失了(我将背景设置为红色,这样我就可以看到它了)。我删除了示例中的所有子视图,但是当我尝试仅删除一个时,会出现相同的效果。
为什么会发生这种情况?这与自动布局有关吗?另外,如果我想在删除其中一个 UILabel 后将其重新定位,我该如何重新进行约束?
【问题讨论】:
检查容器约束是否设置正确 【参考方案1】:在使用 AutoLayout 时修改框架是不允许的。一旦您开始使用 AutoLayout,您实际上就是在告诉系统您希望它为您设置框架。
创建指向约束的属性并为这些约束设置动画,而不是直接为框架设置动画。
【讨论】:
我为我用来使containterView
的 Y 轴相对于其父视图居中的约束之一创建了一个属性。我改变了常数而不是使用CGRectOffset,并且动画是正确的。但是,问题仍然存在。一旦我删除子视图,containerView
就会消失。
容器视图的高度是基于所有标签还是一个标签?如果是后者,您是否要删除用于设置高度的那个标签?您是否尝试过为测试目的明确设置高度,然后删除标签以查看它是否消失;如果没有,您知道消失是基于标签上的约束,而不是其他东西。以上是关于CGRectOffset 后自动布局不起作用的主要内容,如果未能解决你的问题,请参考以下文章