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

Macos 如何以编程方式关闭NSView子视图的Cocoa自动布局?,macos,cocoa,autolayout,Macos,Cocoa,Autolayout,我已经研究了其他类似的问题,但没有一个解决了真正以编程方式绕过NSView子视图的自动布局的问题 我需要告诉Auto Layout不要布局特定NSView的子视图。我已经尝试覆盖layout(),但这只会生成一个警告,并且对它没有任何约束的子视图(我已经在它上面设置了translatesAutoResizezingMaskintoConstraints=false,因为我不希望自动生成任何约束或其他)将其帧设置为所有零[x=0,y=0,width=0,height=0]。我发现很难相信没有办法告

我已经研究了其他类似的问题,但没有一个解决了真正以编程方式绕过
NSView
子视图的自动布局的问题

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

  • 一个记录笔记的应用程序,用户可以在其中创建和定位基本的几何形状和文本视图。这些都是
    NSView
    子类。我当然可以使用约束并操纵这些约束,但视图中不应该以任何方式自适应的点是什么
  • 一个数学应用程序,我使用自动布局在单独的行上布局数学。我想暂时关闭未编辑的行的自动布局,因为当您添加更多行和数学对象时,自动布局计算开始使应用程序越来越无响应。因为唯一需要布局计算的是如果是用户正在编辑的行,则可以通过关闭其他行的自动布局来优化流程

  • 没有办法做你想做的事

    对于整个窗口,而不是单个视图,自动布局处于打开或关闭状态。如果窗口中的任何视图已添加约束或属于其
    +requiresconsttraintbasedlayout
    方法返回true的类,则窗口使用自动布局

    如果您想使用旧的方式定位视图,通过设置其框架和自动调整大小掩码,那么您希望
    translatesAutoResizezingmaskintoConstraints
    为真。事实上,这是编程创建视图的默认设置,正是为了向后兼容自动布局不知道的代码,以便在其他窗口中操作使用自动布局。你关闭它的理由是完全相反的

    只需离开或打开
    translatesAutoResizengMaskintoConstraints
    ,让您的代码负责将视图的框架设置为所需的任何值。请确保也根据需要将视图的
    AutoResizengMask
    设置为
    NSViewNotSizable
    。通常需要停用任何其他约束持续时间内视图上的ts


    如果您需要为整个视图子层次结构执行此操作,那么您必须执行此操作-启用
    translatesAutoresizingMaskIntoConstraints
    ,并为整个子层次结构设置框架和
    autoresizingMask
    。然而,这对我来说似乎不是一个合理的方法。

    谢谢Ken。这正是我所担心的。Au布局似乎不是一个友好的伙伴;o)我也尝试过使用“TranslatesAutoResizingMacSkintoConstraints=true”,但如果一个框架设置为负宽度或负高度,它会引发一个异常。我允许这样做,因为当用户可以通过拖动在任何方向绘制矩形时,它会使数学变得更容易。然后,我只是将框架标准化为a用户完成后。使用自动布局进行所有这些操作会让事情变得更加复杂,毫无原因。在数学应用程序中,我真的需要以某种方式优化自动布局过程。您描述的笔记应用程序描述方法不是最佳的。撇开文本视图不谈,这种应用程序通常只有一个
    NSV查看(画布)。这些几何图形只是贝塞尔路径(
    NSBezierPath
    实例),用户拖动它们时,这些路径会重复绘制。如果您想了解如何实现这一点,请查看苹果的草图演示应用程序(它还向您展示了如何创建可以在画布中移动的文本)谢谢保罗。我已经看过了草图演示,也考虑了这个方法,但是由于各种各样的原因,在每个对象方法的NSVIEW上决定了。