在Mac OS X中自动布局和调整视图大小

时间:2012-12-12 17:51:17

标签: objective-c macos cocoa autolayout

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

我的应用有一个固定宽度/高度的窗口。 我真正想要做的是调整窗口中的控件。 例如,我有一个搜索字段,应该扩展&如果点击则崩溃。 我在左边放置一个NSPathControl,如果NSSearchField扩展,它应该缩小,所以它们不会崩溃。

现在,如果我调整窗口大小,它会起作用,但如果我在代码中设置视图的框架,它就不会。 Autolayout只是忽略了这一点。

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

我是否需要在autolayout中启用,或者我必须在代码中以不同方式设置帧?

修改

通过在搜索字段中设置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.

1 个答案:

答案 0 :(得分:3)

我的解决方案


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

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


问题是你实际上不应该调用setFrame:当你使用autolayout时。你应该得到正确的约束并改变它。它使得它变得更加容易,您可以简单地设置宽度,并自动为您处理帧原点。