如何以编程方式关闭 NSView 子视图的 Cocoa 自动布局



我看过其他类似的问题,但没有一个解决真正以编程方式绕过自动布局以获取NSView子视图的问题。

我需要告诉自动布局不要布局特定NSView的子视图。我尝试覆盖layout(),但这只会生成一个警告,并且没有约束的子视图(我已经对其进行了translatesAutoresizingMaskIntoConstraints = false设置,因为我不希望自动生成任何约束或其他方式)无论如何都会将其帧设置为所有零[x=0, y=0, width=0, height=0]。我发现很难相信没有办法告诉自动布局不布局视图。 translatesAutoresizingMaskIntoConstraints = true不是我想要的,因为我想为视图的所有子视图完全禁用自动布局。我有两种情况需要这个:

  1. 一个笔记应用,用户可以在其中创建和定位基本的几何形状和文本视图。这些都是NSView子类。我当然可以使用约束并操纵它们,但是在一个不应该以任何方式适应的观点中有什么意义呢?
  2. 一个数学应用程序,我使用自动布局将数学布局在单独的行上。我想暂时关闭未编辑的行的自动布局,因为随着您添加更多行和数学对象,自动布局计算开始使应用程序逐渐变得无响应。由于唯一需要布局计算的是用户正在编辑的行,因此可以通过关闭其他行的自动布局来优化该过程。

没有办法做你想做的事。

整个窗口的自动布局是打开或关闭的,而不是单个视图。如果窗口中的任何视图添加了约束,或者属于+requiresConstraintBasedLayout方法返回 true 的类,则该窗口使用自动布局。

如果要使用旧的视图定位方式(通过设置视图的框架和自动调整大小蒙版),则希望translatesAutoresizingMaskIntoConstraints为真。实际上,这是以编程方式创建的视图的默认设置,正是为了向后兼容自动布局无感知代码,以便在使用自动布局的窗口中运行。您关闭它的理由完全是倒退的。

只需离开或打开translatesAutoresizingMaskIntoConstraints,并让您的代码负责将视图的框架设置为所需的任何内容。确保还根据需要设置视图的autoresizingMask,也许是NSViewNotSizable。通常需要在持续时间内停用视图上的任何其他约束。

如果您需要为整个视图子层次结构执行此操作

,那么您将不得不为整个子层次结构执行此操作 - 启用translatesAutoresizingMaskIntoConstraints并设置框架和autoresizingMask。但是,这对我来说似乎不是一个合理的方法。

最新更新