【问题标题】:Auto-layout and resizing views in Mac OS XMac OS X 中的自动布局和调整视图大小
【发布时间】:2025-11-22 05:35:01
【问题描述】:

我正在尝试为 Mac OS X 10.7 进行自动布局设计。

我的应用有一个固定宽度/高度的窗口。 我真正想做的是调整窗口中控件的大小。 例如,我有一个搜索字段,如果单击它应该展开和折叠。 我在左侧放置了一个 NSPathControl,如果 NSSearchField 展开,它应该会缩小,因此它们不会折叠。

现在,如果我调整窗口大小,它可以工作,但如果我在代码中设置视图的框架,它不会。 自动布局只是忽略了这一点。

我只是在做[[this animator] setFrame:newFrame];

我必须在自动布局中启用什么,还是必须在代码中以不同方式设置框架?

编辑

我通过在搜索字段中设置self.translatesAutoresizingMaskIntoConstraints = YES; 使约束起作用。 我不确定这是否是个好主意。

此外,它还给了我以下日志:

2012-12-12 19:41:30.958 Expanding Search[1428:303] Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(1)-|   (Names: '|':ITPathbar:0x10190a670 )>",
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.
2012-12-12 19:41:32.835 Expanding Search[1428:303] 74
2012-12-12 19:41:32.854 Expanding Search[1428:303] Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(14.5)-|   (Names: '|':ITPathbar:0x10190a670 )>",
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.

【问题讨论】:

  • 就我了解自动布局而言,我知道您不应该致电-setFrame:。你能解释一下你是如何设置约束的吗? Cocoa 一开始是如何分割搜索和路径控件之间的空间的?它们总是相同的比例吗?是什么限制让他们保持这种状态?
  • @noa 我有一个简单的窗口,具有灵活的高度和宽度。因此,您可以调整窗口大小。然后我有一个自定义搜索字段,它可以改变它的宽度,固定在窗口的右上角。此外,我还有另一个按钮,作为测试,固定在搜索字段的左侧。现在,我目前用setFrame:设置宽度,我还必须将translatesAutoresizingMaskIntoConstraints设置为YES
  • @noa 好的,我发现你可以设置[[constraint animator] setConstant:newWidth]; 并且它可以工作。现在我只剩下一个问题了,我不确定如何才能真正获得宽度约束。我使用[self constraints] 获得了所有约束,它是我的示例中的第一个约束,但当然可能会有所不同。我可以做一个插座,但这似乎不太聪明。
  • 是的,虽然看起来很奇怪,但我认为插座是正确的做法。
  • @noa 谢谢,我在 * 上问了另一个问题,我得到了这个答案:*.com/questions/13857115/…

标签: objective-c macos cocoa autolayout


【解决方案1】:

我的解决方案


我知道了,我在 Github 上发布了它,对 here

我还问了另一个更具体的问题,已解决 here


问题是你实际上不应该调用 setFrame: 当你使用自动布局时。你应该得到正确的约束并改变它。这让它变得容易多了,你可以简单地设置宽度,框架原点会自动为你处理。

【讨论】:

    最近更新 更多