从OSX 10.7开始,如果您希望执行NSView的手动布局,您应该通过覆盖布局方法来实现,并且只要您希望安排对此方法的调用,您只需执行以下操作:
[myView setNeedsLayout:YES]
我对iOS中的这种模式非常熟悉,但是在OSX上它似乎不起作用.我已经创建了一个自定义的NSView并实现了布局,但它似乎永远不会被调用.永远.不是在添加子视图之后,不是在调用setNeedsLayout之后:是,从来没有,我不知道为什么.我可以手动调用布局,事情按预期工作,但文档说永远不要这样做.
来自Xcode:
- (void)layout
Override this method if your custom view needs to perform custom
layout not expressible using the constraint-based layout system. In
this case you are responsible for calling setNeedsLayout: when
something that impacts your custom layout changes.
来自在线文档:
You should only override layout only if you want to do custom layout.
If you do, then you also need to invoke setNeedsLayout: when something
that feeds into your custom layout changes.
任何帮助深表感谢.
更新:
这是一个示例Xcode项目的链接,它说明了问题LayoutTest.zip
最佳答案 您需要启用自动布局.如果您正在使用xib文件(并且您应该没有突击队!),您可以检查文件检查器的Interface Builder Document部分中的autolayout复选框.
在代码中:
[myView setTranslatesAutoresizingMaskIntoConstraints:YES]
在您的示例项目中,您没有约束.视图不会在没有任何约束的情况下调用布局.
NSView *aView = self.window.contentView;
NSDictionary *viewsDictionary=NSDictionaryOfVariableBindings(aView, complexView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[aView]-[complexView]" options:0 metrics:nil views:viewsDictionary];
for (NSLayoutConstraint *constraint in constraints) {
[complexView addConstraint:constraint];
}