NSLayoutConstraint阻止NSWindow调整大小

时间:2014-07-22 20:03:32

标签: objective-c macos cocoa nswindow nslayoutconstraint

我在我的主要NSWindow中为NSView添加了一些简单的约束,但它引起了问题。

通常我可以调整应用程序窗口的大小(就像任何Safari / Finder窗口一样)。我像这样在我的窗口添加一个简单的NSView:

[self.blackDimOverlay setFrame:NSMakeRect(0, 0, self.window.frame.size.width, self.window.frame.size.height)];
        [self.blackDimOverlay setAlphaValue:0.5f];
        [self.window.contentView addSubview:self.blackDimOverlay];

这可以按预期工作。然后,我为此视图添加了两个约束,以便在调整大小时保持窗口的完整大小。

NSDictionary *viewsDict = NSDictionaryOfVariableBindings(_blackDimOverlay);
        NSArray *constraintHorizontalOverlay = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_blackDimOverlay]-0-|" options:0 metrics:nil views:viewsDict];
        NSArray *constraintVerticalOverlay = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_blackDimOverlay]-0-|" options:0 metrics:nil views:viewsDict];
        [self.window.contentView addConstraints:constraintHorizontalOverlay];
        [self.window.contentView addConstraints:constraintVerticalOverlay];

然而,在添加这两个约束后,它们会锁定我的窗口,因此我无法再调整它的大小。其他所有工作都正常,但约束阻止任何窗口调整大小。

如何在调整窗口大小的同时将子视图保持为窗口的全尺寸?

感谢。

1 个答案:

答案 0 :(得分:8)

_blackDimOverlay还有其他限制因素决定了它的大小,优先级高于NSLayoutPriorityDragThatCanResizeWindow。您可以使用以下方式进行调查:

NSLog(@"%@", [self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]);
NSLog(@"%@", [self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationVertical]);

很可能,您忘记了[_blackDimOverlay setTranslatesAutoresizingMaskIntoConstraints:NO]

或者,_blackDimOverlay是一个实例的视图类定义了一个内在大小,其拥抱和压缩阻力优先级高于NSLayoutPriorityDragThatCanResizeWindow。您需要使用-setContentHuggingPriority:forOrientation:-setContentCompressionResistancePriority:forOrientation:来减少这些优先级。