UIButton 的帧大小何时最终设置

Posted

技术标签:

【中文标题】UIButton 的帧大小何时最终设置【英文标题】:When is the frame size of a UIButton finally set 【发布时间】:2016-12-20 16:32:03 【问题描述】:

我创建了UIButton 的自定义子类,所以我可以添加一个额外的标签。当此按钮位于 UIStackView 中时,额外标签的大小不正确。我尝试以编程方式向父按钮添加约束。这行得通,但我有页面损坏的约束警告(有点夸张)。如果我知道按钮何时被分配了最终尺寸,我可以设置添加的标签框架。

在完成所有自动布局之后,何时知道UIButton 的大小?

【问题讨论】:

你检查过 StackView 的填充属性值吗? 按钮的框架应该是已知的,并且可以在调用 layoutSubviews() 时使用,这可以在您的自定义类中覆盖 这是在添加按钮时设置的,添加到UIView。或在viewDidLoad 谢谢 Ben,layoutSubviews 做到了。 Ben,正确 - 我使用它,或者在超级视图中使用 viewWillLayoutSubviews。 @Jimmy,这是一个非常糟糕的建议 - 当涉及自动布局时,我建议永远不要使用 viewDidLoad,因为代码中实例化的视图多次(全部?)都没有框架。 【参考方案1】:

根据我上面的 cmets,按钮的框架应该是已知的,并且可以在调用 layoutSubviews() 时使用,这可以在您的自定义类中覆盖

【讨论】:

【参考方案2】:

viewDidLayoutSubViews 是最后完成的方法。在分配自动布局约束时,它会为您提供正确的 Rect 信息。您可以使用它来设置约束。

【讨论】:

【参考方案3】:

试试这个:把"print("frame is: ", button.frame," in method name")" 放在下面的方法中。

viewDidLoad

viewDidLayoutSubviews

viewWillLayoutSubviews

viewWillAppear

viewDidAppear

您会注意到按钮的实际最终帧直到最后调用 viewDidLayoutSubviews 和 viewDidAppear 才会发生,并且在此之前 viewDidLayoutSubviews 被调用了很多次,这在您尝试时尤其烦人根据按钮标题标签的大小调整此标签上的字体大小。

如果堆栈视图与您的大小不一致,请将 UIView 拖到堆栈视图中并将按钮放入其中,然后您可以将按钮约束到该视图。

【讨论】:

以上是关于UIButton 的帧大小何时最终设置的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 动作

UIButton的界面状态

Iphone UIButton 背景颜色

如何将 UIButton 设置为 Touch ID 或 Face ID 图像

在 UIStackView 中增加 UIButton 的面积

如何更改 UIButton 标题?