objective-c – 在setNeedsLayout之后未调用的NSView布局方法:YES

从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.

链接:http://developer.apple.com/library/mac/#releasenotes/UserExperience/RNAutomaticLayout/#//apple_ref/doc/uid/TP40010631-CH1-SW14

任何帮助深表感谢.

更新:
这是一个示例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];
}
点赞