您可以使用自动布局添加派生约束吗?

Posted

技术标签:

【中文标题】您可以使用自动布局添加派生约束吗?【英文标题】:Can you add a derived constraint using auto layout? 【发布时间】:2013-12-09 01:10:54 【问题描述】:

在使用类似于自动布局约束概念的机械 CAD 软件中,您通常可以添加“派生约束”。这对布局没有影响,但可以让您直接读取重要维度的值。

例如,考虑具有两个子视图的视图的以下布局:

     32       64
  |------| |------|

|-[imgOne]-[imgTwo]-|

|-------------------|
          w

视图的宽度是左右默认边缘间距、图像视图之间的默认间距以及应用于图像视图的两个宽度约束(32 和 64)之和。

我想在运行时知道w

理论上,这应该是view.bounds。但是,读取该属性并不总是安全的(因为视图可能尚未更新其布局约束)。

是否可以添加一个对视图大小没有影响但在布局完成后会更新其.constant 属性的约束?

(我尝试向视图添加宽度约束,优先级为1,但.constant 始终读取标称值,而不是实际值。)

【问题讨论】:

【参考方案1】:

添加“派生”约束将使您进入您开始时的同一个洞——等待自动布局完成您的视图布局。一切都与时机有关。使用自动布局时,读取视图最终几何图形的好地方是在视图控制器的 viewDidLayoutSubviews 方法中。换句话说,在 viewDidLayoutSubviews 中读取视图的边界。

【讨论】:

即使它确实让你陷入了同一个洞——而且它肯定可以,这取决于它是如何实现的——我仍然希望有一种方法可以避免直接访问边界,因为这似乎是倒退了一步当其他所有内容都受到约束时。

以上是关于您可以使用自动布局添加派生约束吗?的主要内容,如果未能解决你的问题,请参考以下文章

自动布局问题

以编程方式为不同大小类创建具有不同常量的自动布局约束

约束/自动布局栏隐藏,Xcode 6

处理自动布局

使用自动布局和约束更改位置

加载视图后iOS自动布局约束的跳跃