自定义 UIView 如何响应基于约束的框架变化

Posted

技术标签:

【中文标题】自定义 UIView 如何响应基于约束的框架变化【英文标题】:Custom UIView How to Respond to Constraint-based frame changes 【发布时间】:2014-05-29 04:38:39 【问题描述】:

我有一个容器 UIView,它有一些约束会导致它改变高度以匹配旧的 3.5 英寸 iPhone 或新的 4 英寸 iPhone。在该容器 UIView 中,我有几个自定义 UIView 的副本,我们称之为DynamicButtonDynamicButton 有三个子视图,它们使用它们的框架布局(无约束),每当调用 [DynamicButton -setFrame] 时,都会重新计算三个子视图的框架

设置了我的约束,以便我的DynamicButton 视图将以相等的高度填充整个容器视图。

viewDidLoadviewWillAppear 中,containerView 的高度是它在情节提要中的高度(与设备无关)。我的DynamicButtons 是58 像素高。

viewDidAppear 中,约束终于生效,containerView 高度在旧的 3.5 英寸 iPhone 上显示时减小到正确的值,而我的 DynamicButtons 是 47 像素高。

但是,我的 DynamicButton 类在更改大小时从未收到 setFrame 消息。

我需要重写什么方法来拦截大小变化,以便重新配置子视图上的框架?

【问题讨论】:

【参考方案1】:

DynamicButton 中覆盖layoutSubviews 并在那里设置您的子视图的框架。

来自layoutSubviews的文档:

[...] 子类可以根据需要重写此方法以执行更精确的子视图布局。仅当子视图的自动调整大小和基于约束的行为不提供您想要的行为时,您才应该覆盖此方法。您可以使用您的实现直接设置子视图的框架矩形。 [...]

【讨论】:

很奇怪,我之前也尝试过,但没有被调用...唉,我一定是错过了什么或第一次做错了,因为现在可以了。谢谢。此外,它的发音为 BeardfaCEY。 @KennyWyland 哈哈,终于有人知道我的名字了。是的,没有问题!奇怪的是它第一次没有工作。

以上是关于自定义 UIView 如何响应基于约束的框架变化的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UIView 的自定义子类设置约束?

从自定义 UIView 类设置视图宽度约束不更新帧

在自定义 UIView 类 Iphone 上应用自动布局约束。

自动布局:使用 UIWebViews 自定义 UIView 高度约束

自定义UIView类约束,具体取决于ParentView

使用其父 VC 底部布局更改我的自定义 UIView 的约束