Jos*_*ane 3 macos cocoa objective-c 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];
Run Code Online (Sandbox Code Playgroud)
这按预期工作.然后,我向此视图添加两个约束,以便在调整大小时保持窗口的完整大小.
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];
Run Code Online (Sandbox Code Playgroud)
但是,添加这两个约束后,它们会锁定我的窗口,所以我不能再调整它了.其他所有工作都正常,但约束阻止任何窗口调整大小.
如何在调整窗口大小的同时将子视图保持为窗口的全尺寸?
谢谢.
还有其他限制因素_blackDimOverlay决定了它的大小,并且优先级高于NSLayoutPriorityDragThatCanResizeWindow.您可以调查使用:
NSLog(@"%@", [self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]);
NSLog(@"%@", [self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationVertical]);
Run Code Online (Sandbox Code Playgroud)
很可能,你忘记了[_blackDimOverlay setTranslatesAutoresizingMaskIntoConstraints:NO].
或者,视图类_blackDimOverlay是一个实例定义了一个内在大小,其拥抱和压缩阻力优先级高于NSLayoutPriorityDragThatCanResizeWindow.您需要使用-setContentHuggingPriority:forOrientation:和减少这些优先级-setContentCompressionResistancePriority:forOrientation:.
| 归档时间: |
|
| 查看次数: |
1399 次 |
| 最近记录: |