【问题标题】:AutoLayout not working after CGRectOffsetCGRectOffset 后自动布局不起作用
【发布时间】: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 后将其重新定位,我该如何重新进行约束?

【问题讨论】:

  • 检查容器约束是否设置正确

标签: ios objective-c iphone uiview uilabel


【解决方案1】:

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

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

【讨论】:

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