如何在自动布局视图中获取 UIButton 位置

Posted

技术标签:

【中文标题】如何在自动布局视图中获取 UIButton 位置【英文标题】:How to get UIButton position in an auto layout View 【发布时间】:2017-04-11 14:01:25 【问题描述】:

我在UIView's 控制器上有一个UIButtonUIButton 的位置距离 UIView 顶部 10 像素,距离另一个 UILabel 10 像素,距离 UIView 的尾随位置 20 像素。 UIButtonUILabel 都具有相同的高度和宽度。视图以自动布局模式设计。

按钮和标签在UIView's控制器中的位置

UIView

  -> `UIButton`, `UILabel`

------------------------------
|                 |          |
|                10          |
|                 |          |
|                B - 20 - L  |
|                            |
------------------------------

ViewDidLoad 方法中检索到的 UIButton 的位置不正确,因为它反映了 xib 的初始位置,但是在加载视图后,按钮位置将随着使用自动布局而改变。

告诉我如何在显示UIView 后检索UIButton 位置(x & y)。

viewdidload方法如下,

- (void) Viewdidload() 

     [UIView addSubview:object1];
     ---
     [UIView addSubview:object2];

谢谢。

【问题讨论】:

viewDidLayoutSubviews() 是一个很好的地方,即使在旋转或视图布局发生任何后续更改之后,您也可以获得按钮的正确坐标。 @AdilSoomro, viewDidLayoutSubviews() 将为添加或删除的每个子视图调用。在我的情况下,这个方法被调用了几次,我可以观察到 UIButton 位置的不同值。 理想情况下,您不会在viewDidLayoutSubviews() 中添加新视图,而是根据需要简单地设置它们的框架或坐标。 请注意 ViewWIllAppera 是获得自动布局的最佳位置。 viewDidLayoutSubviews 也被 ViewWillAppear 调用,但不是每次都调用。在设备旋转时,只有 viewDidLayoutSubviews() 被调用。 【参考方案1】:

在生命周期 viewDidLoad() 被调用时,视图不是(自动)布局的。

获取viewDidAppear()viewWillAppear()中的职位。

【讨论】:

viewDidLayoutSubviews() 可能是更好的选择 @picciano 为什么更好? 它可能大部分时间都可以工作,但 viewDidAppear 只被调用一次,可能在后续调用 layoutSubviews 时执行附加布局之前。如果再次执行布局,例如方向更改或添加其他子视图,也不会再次调用它。 @picciano 我如何理解 OP 想要“在显示 UIView 后检索 UIButton 位置(x & y)”的问题。在我的理解中,viewDid/WillAppear() 是正确的方法。

以上是关于如何在自动布局视图中获取 UIButton 位置的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:包含 UILabel + UIButton 的标题视图

如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。

运行时自动布局的 UIButton 大小

UIButton,自动布局和获取按钮的高度

使用自动布局将 UIButton 添加到自定义单元格

如何在 UIButton 的标签子视图上设置 alpha