NSLayoutConstraint 防止 NSWindow 调整大小

Posted

技术标签:

【中文标题】NSLayoutConstraint 防止 NSWindow 调整大小【英文标题】:NSLayoutConstraint Prevents NSWindow Resizing 【发布时间】:2014-07-22 20:03:32 【问题描述】:

我正在向主 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】:

_blackDimOverlay 有额外的限制,这些限制决定了它的大小,并且比NSLayoutPriorityDragThatCanResizeWindow 具有更高的优先级。您可以使用以下方法进行调查:

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

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

另外,_blackDimOverlay 是其实例的视图类定义了固有大小,并且其拥抱和抗压缩优先级高于NSLayoutPriorityDragThatCanResizeWindow。您需要使用 -setContentHuggingPriority:forOrientation:-setContentCompressionResistancePriority:forOrientation: 减少这些优先级。

【讨论】:

以上是关于NSLayoutConstraint 防止 NSWindow 调整大小的主要内容,如果未能解决你的问题,请参考以下文章

11月10号晚8点!NIKE NSW TCH FLC WR AOP !男子运动茄克RMB158

新店公布 可直接拍! NIKE NSW TCH FLC WR AOP 满满回忆 RMB158包 16年新款!

约束对象以防止对象更改大小时移动它们

朋友给了个交换机,是磊科的NSW1616,网上说有网管功能,但是没看到有console口,用web管理也进去不了。

NSLayoutConstraint 激活/停用

NSLayoutConstraint 问题