如何以编程方式关闭视图层次结构的自动布局?

时间:2015-03-18 11:56:21

标签: storyboard autolayout xib nsview nsscrollview

我创建了一个单独的框架来容纳我的视图层次结构,启用了AutoLayout。为了达到这个目的,我没有勾选"使用自动布局" Interface Builder中的复选框(在故事板上)。

我将以下操作添加到此基本视图中的按钮,以测试视图层次结构(视图+按钮)上没有生成任何约束:

    @IBAction func buttonPressed(sender:AnyObject?){
    println(self.view.constraints)
    println(self.view.subviews[0].constraints)
}

然后我将上面的框架导入到一个新的Cocoa应用程序中,该应用程序启用了AutoLayout,并在容器视图控制器中重新使用上面框架中的View Controller。按下按钮时,结果如下:

[]
[<NSContentSizeLayoutConstraint:0x6080000a7da0 H:
[NSButton:0x600000140e70'Button'(46)] Hug:250 CompressionResistance:750>,
<NSContentSizeLayoutConstraint:0x6080000ad6e0
V:NSButton:0x600000140e70'Button'(21)] Hug:250 CompressionResistance:750>]

的问题:

  1. 上述意思是我的按钮以某种方式获得了一些限制吗?
  2. 他们的另一种(更具编程性的方式)是在视图层次结构中关闭AutoLayout - 在这种情况下,除了关闭约束之外,我不会将故事板用于其他任何事情。
  3. 进一步信息:

    translatesAutoResizingMasksIntoConstraints对于视图和按钮都设置为false - 为了安全。

    我也尝试过运行Instruments / AutoLayout,但是当我的程序启动时会崩溃。崩溃报告中的堆栈跟踪显示它在崩溃时忙于与AutoLayout相关的调用!

    修改

    我想在视图层次结构的一部分中禁用AutoLayout,以便在滚动具有复杂布局的文档时获得性能优势。

    我的scrollView正在对类似于tableView的控件执行滚动(它是一个电子表格网格)。当我向右滚动等时,我的方法是从左侧移动(也称为重新布局)单元格......我发现当我滚动得非常快时会出现滞后效应(表现为闪烁/闪烁在角落里)屏幕)细胞无法快速移动。它们当然会赶上500ms-1000ms左右,但它看起来并不是那么好。

    使用仪器(时间分析器)我还可以看到很大一部分忙碌时间是由&#34;布局&amp;显示&#34;布局与即使显示有关。我还进行了测试,没有将内容加载到单元格中,以确定是否布局没有发生得足够快(并且它不是)。

    更有趣的是,看看乐器(AutoLayout)我当然可以看到它在滚动期间非常忙于处理限制但我不能说这是否一定是坏的。

    我的想法是,对于像这样的复杂(按移动部件的数量)视图/控制,AutoLayout可能需要更长时间才能在数学上解决约束集问题,而不是如果我直接告诉它新帧的时间需要花费的时间是直接的。

1 个答案:

答案 0 :(得分:1)

每个窗口启用或禁用自动布局,而不是视图层次结构的各个部分。如果窗口中的任何内容使用自动布局,那么整个窗口就可以了。也就是说,如果有任何内容为窗口的层次结构中的任何视图添加或激活约束,或者任何视图的类覆盖+requiresConstraintBasedLayout以返回true,则窗口将使用自动布局。

请注意,系统视图甚至主题框架视图(绘制标题栏的内容)都可以在您不知情的情况下使用自动布局。即使您窗口中的视图在当前版本的操作系统中没有使用自动布局,他们也可以在以后的任何版本中进行更改。

所以:不,你不能禁用某些自动布局。

translatesAutoResizingMasksIntoConstraints设置为false不会避免启用自动布局。它只是意味着如果自动布局 打开(通过别的东西),那些视图将被错误地布局(因为它们没有从其他任何地方获得约束)。通常情况下,将translatesAutoResizingMasksIntoConstraints设置为false只能通过选择 到自动布局的代码来完成。

translatesAutoResizingMasksIntoConstraints默认为true是允许系统在应用程序中透明地启用自动布局的应用程序,这些应用程序不是为了使用自动布局而不会破坏其行为。

滚动时,您如何确定自动布局与性能问题有关?


更新

减轻网格视图的自动布局所带来的性能损失的一种可能方法是关闭单元视图的translatesAutoResizingMasksIntoConstraints(正如我所说的那样是一个坏主意),然后手动设置它们覆盖-layout的帧。我认为是合法的。

你可能会在将它们添加到超级视图时设置它们的帧,但这还不够。如果您没有在-layout覆盖中进行布局,则自动布局可能会将其框架归零。

相关问题