iOS:在自定义视图中添加新约束依赖于视图的框架

Posted

技术标签:

【中文标题】iOS:在自定义视图中添加新约束依赖于视图的框架【英文标题】:iOS: Adding new constraints in a custom view the rely on the view's frame 【发布时间】:2018-04-09 21:57:26 【问题描述】:

我试图了解何时覆盖 layoutSubviewsupdateConstraints

我创建了一个自定义视图,该视图包含其他视图。我无法在自定义初始化程序中设置视图子视图的约束,因为我还不知道自定义视图的框架。

目前我有这个:

-(void)layoutSubviews

    [super layoutSubviews];
    // Add new constraints

然后每当我添加或删除任何子视图时,我都会调用[self setNeedsLayout];

这是正确的方法吗?每当调用 layoutSubviews 时,我目前正在重新创建约束。我听说updateConstraints 可能是我想要的?但我不确定,因为子视图的数量不会保持不变,因此约束的数量也不会保持不变。

【问题讨论】:

您的自定义视图可以有不同数量的子视图,具体取决于初始化程序中设置的内容? 你最好不要混合约束和框架。只需为子视图添加约束即可。 @slickdaddy 没错,以后子视图的数量可能会改变 【参考方案1】:

您应该在添加子视图时添加约束。您可以为每个子视图单独执行此操作,如果可以概括,也可以在自定义方法中执行此操作。

layoutSubvewsupdateConstraints 方法是回调,它们在布局周期的特定点被调用。特别是,它们被多次调用,这会自动禁止您使用约束,因为存在多次创建约束的危险。

正如documentation 所述,layoutSubviews 仅应在以下情况下使用

如果子视图的自动调整大小和基于约束的行为不能提供您想要的行为。

如果调用layoutSubviews,当前的自动布局已经完成,添加、删除或修改约束可能会重新触发布局过程。这可能会极大地降低您的应用速度。

updateConstraints 的 documentation 还包含一个明确的声明,您应该何时覆盖它:

重写此方法以优化对约束的更改。

更改约束并不意味着添加约束。如果您在不同时间需要不同的视图约束,您可以在运行时 deactivate 未使用和 activate 需要约束。这可以在updateConstraints 中完成。

顺便说一句:setNeedsLayout 的(显式)调用通常是不必要的,尤其是在您更改了视图层次结构或布局约束的情况下。

【讨论】:

这很有帮助,谢谢。最后,我意识到我可以将约束更改为不依赖于视图的框架,因此我可以将这些约束添加到视图的初始化程序中。

以上是关于iOS:在自定义视图中添加新约束依赖于视图的框架的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 iOS 8 自动布局问题

“添加新约束”为啥左右为-16,而不是0?

如何在自定义 TitleView 的子视图上添加子视图

在自定义表格视图 ios 中显示按钮

iOS Button 在自定义视图中不起作用

ios) 如何在自定义键盘上方创建建议视图