【发布时间】: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