超级视图框架更改后更新子视图的约束

Posted

技术标签:

【中文标题】超级视图框架更改后更新子视图的约束【英文标题】:Update constraints of subviews after superview frame changes 【发布时间】:2015-10-07 12:19:49 【问题描述】:

我有一个 UIView 子类(用于处理拖放),并且在 Interface Build 中我添加了两个子视图:UIImageViewUILabel

两者都有约束:

UIImageView 边框匹配超级视图边框以填充所有可用空间。 UILabel 垂直和水平居中。

这里可以看到三个(superview背景是绿色的)。

当我在超级视图中为帧更改设置动画时,我的问题就出现了。 superview 看起来不错,但它的 subviews 变得疯狂。

在这里你可以看到(忽略棕色方块,从另一个角度)

如您所见,尽管我在每个子视图上都调用了updateConstraints,但子视图从父视图中“落下”。

我知道将 AutoLayout 与 setFrame 混合使用是一种不好的做法,但这是我知道的唯一方法。

谢谢

【问题讨论】:

为什么不移除superview并将UIImageView的背景设置为绿色?然后使用正确的contentmode正确调整图片大小,看这个问题:***.com/questions/4895272/… 我试过了,但后来我无法将 UILabel 设置为 UIImageView 的子视图。此外,绿色只是暂时的。 是否可以包含您的源代码?您所描述的行为是预期会发生的。需要考虑的几件事:您是否在控制台运行时收到任何警告?如果约束无法解决,一些约束将被破坏,您将在日志中收到警报。 -updateConstraints 不需要在子视图上调用,除非您实际修改它们。在您的情况下,这听起来没有必要。你是如何处理定位被拖动的视图的?如果视图是使用约束定位的,但随后您修改了框架,则可能会发生意外行为 可以使用自动布局来为帧更改设置动画:***.com/questions/13296232 您有什么理由不能为超级视图执行此操作吗? 【参考方案1】:

感谢 cmets 我做了一些更改。

1) 使用 UIImageView 更改超级视图(绿色)。

2) 移除 UILabel 并使用 CATextLayer 放置文本,使用this answer 将文本垂直居中放置在 UIImageView 前面。

现在它工作正常。感谢您的帮助。

【讨论】:

以上是关于超级视图框架更改后更新子视图的约束的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UICollectionViewCells 在动画超级视图约束更改时会更改 alpha 值?

限制在超级视图中水平和垂直居中阻止我更改框架

以编程方式从超级视图中删除视图后更新约束/框架(自动布局)

使用自动布局动态更改子视图后调整超级视图的大小

如何使用自动布局动态更改超级视图的高度

修改超级视图的框架时自动调整子视图的大小