CGRectOffset 后自动布局不起作用

Posted

技术标签:

【中文标题】CGRectOffset 后自动布局不起作用【英文标题】:AutoLayout not working after CGRectOffset 【发布时间】:2014-12-11 21:19:34 【问题描述】:

我有一个名为 containerView 的 UIView。

我将此作为子视图添加到控制器视图的根视图中。我以编程方式为其添加了一些约束(我将其居中并使宽度与父视图的宽度相差几个点)。

我在containerView 中添加了一些UILabels 作为子视图。 UILabels 的高度决定了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
     ];

我需要删除作为子视图放入的UILabels,并用不同的标签替换它们。但是,当我删除 UILabel 中的一个时,整个containerView 就消失了(我将背景设置为红色,这样我就可以看到它了)。我删除了示例中的所有子视图,但是当我尝试仅删除一个时,会出现相同的效果。

为什么会发生这种情况?这与自动布局有关吗?另外,如果我想在删除其中一个 UILabel 后将其重新定位,我该如何重新进行约束?

【问题讨论】:

检查容器约束是否设置正确 【参考方案1】:

在使用 AutoLayout 时修改框架是不允许的。一旦您开始使用 AutoLayout,您实际上就是在告诉系统您希望它为您设置框架。

创建指向约束的属性并为这些约束设置动画,而不是直接为框架设置动画。

【讨论】:

我为我用来使containterView 的 Y 轴相对于其父视图居中的约束之一创建了一个属性。我改变了常数而不是使用CGRectOffset,并且动画是正确的。但是,问题仍然存在。一旦我删除子视图,containerView 就会消失。 容器视图的高度是基于所有标签还是一个标签?如果是后者,您是否要删除用于设置高度的那个标签?您是否尝试过为测试目的明确设置高度,然后删除标签以查看它是否消失;如果没有,您知道消失是基于标签上的约束,而不是其他东西。

以上是关于CGRectOffset 后自动布局不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

自动布局不起作用?

为啥自动布局约束不起作用?

自动布局不起作用

为啥这个 UIScrollView 自动布局不起作用?

自动布局上的 UILabel sizeWithFont 不起作用