如何使用Cocoa Auto Layout使用窗口调整自定义视图的大小?


71

我有一个带有单个自定义视图的窗口,并且希望该自定义视图随窗口调整大小,以便它随时可以完全填充它。如果我写:

然后,窗口不允许我调整其大小。
如果我添加:

然后,自定义视图不会出现(drawRect:似乎从未调用过)。我尝试了不同的方法(包括视觉格式@"|[customview]|"),但始终遇到相同的问题。我知道可以使用较旧的自动调整大小系统来实现,方法是:

但是我想使用Cocoa Auto Layout系统,并且想在更复杂的情况下使用它(例如总是填充窗口的几个自定义视图)。

有谁知道哪里出了问题,我应该如何使用自动版式系统来获得所需的结果?


1
这可能有助于调试:[[contentView constraints].window visualizeConstraints:contentView.constraints];
2011年

我已经针对您所描述的情况测试了三种使用自动版式的不同方式,并且所有这三种方式都可以使用。您的代码中肯定还有其他一些因素阻止了“自动版式”正常工作。您能否上传一个重现问题的最小测试用例?

确实,它确实有效,我找不到问题所在……在将视图添加到超级视图之前,我可能曾经在某种程度上应用了约束(但这确实在控制台上输出了一个错误,但我没有看到) 。也许还有其他问题,通过问这个问题,它使我从头开始重写了所有内容,而没有出现最初的问题……
Guillaume

Answers:


108

使用“自动版式”,(至少)有三种方法可以约束视图,使其占据整个窗口的内容视图,并在适当时调整大小。

关于超级视图的视觉格式约束

边缘的程序约束

(这应与上面的视觉格式等效)

程序限制大小


第三种方法是问题中列出的方法,如果存在进一步的限制,它可能不起作用。例如,没有:

原始的autoresize蒙版也将应用,这会导致问题中描述的行为:不调整窗口大小。

如Regexident所述,您可以使用:

调试自动版式。同样值得检查控制台输出。


1
请注意,第三种方法是不完整的,将导致SIGABRT,因为ios知道它的高度和宽度,但不知道它的实际放置位置!您需要在每个维度中提供两个{开始,结束,长度}。
本·惠勒2013年

@BenjaminWheeler是,我认为您是对的。如果我不愿意,请随时编辑答案。

谢谢。我也一样 它适合屏幕。但是我无法调整NSPanel的大小。
Vignesh 2013年

1
@Jbryson我认为这是Cocoa,而不是Cocoa Touch,所以需要NSView。酷热
传输

1
@KKendall感谢NSView的注意,我还没有意识到上下文不是iOS!
Jbryson

47

@Bavarious的答案很好,我只会再添加一些内容。

学习使用内置的调试支持非常重要!与许多开发一样,希望您一开始就能始终做好所有事情是不现实的。这是自动布局的主要问题,因此我们在调试上投入了大量精力。步骤如下:

  1. 确定在错误位置的视图。从gdb调用方法-[NSView _subtreeDescription]和/或传递参数-NSShowAllViews是,可以帮助您确定哪个视图错误。
  2. 确定一个或多个错误或缺失的约束。-[NSLayoutConstraint ConstraintsAffectingLayoutForOrientation:]可帮助您减少处理约束的次数。-[NSWindow visualizeConstraints:]可以帮助您查看这些约束什么并且您可以从中看到哪些不是您想要的约束。它还将显示布局是否模棱两可(约束不足)。
  3. 确定错误约束的来源。Instruments中的Cocoa Layout模板有点像Leaks仪器-它会向您显示约束生命周期中的所有事件,例如它的创建位置,添加到窗口中,进行修改等。因此,一旦您知道了什么约束是问题所在,请使用Instruments中的搜索字段进行过滤,以仅查看该约束,然后您可以查看所有生命周期事件的回溯,并找出您在哪里执行了您不需要的操作。

通常,您要发布的问题类型(我的东西不起作用!)不足以让人们分辨出什么地方出了问题,这是使用调试工具很重要的原因之一。有关更多信息,请参阅WWDC 2011会话视频(全部免费)和文档。

Buuuuut我实际上可以告诉您这次出了什么问题。:-)在关闭translatesAutoresizingMaskIntoConstraints之前,您受到的约束比您想约束的要多-视图的宽度和高度也已固定,这就是无法调整窗口大小的原因。不过,在您将其关闭之后,布局却模棱两可,因为您还没有将视图固定在任何东西上!您已经说过应该有多大(与超级视图相同),但没有说应该在多大的位置

Cocoa Frameworks,主要的自动布局作者


感谢您的回答,尤其是最后的清楚解释,这有助于我了解问题所在。
Guillaume

6
肯,只想说一下自动布局方面的出色工作。花了我一段时间来了解如何有效地使用它,但是我已经能够用它做一些非常强大的工作。干杯!
sudo rm -rf 2012年

5

您可以使用布局锚来创建约束,格式非常易于理解:

Swift2代码

采用:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.