Macos OSX自动布局可防止调整窗口大小

Macos OSX自动布局可防止调整窗口大小,macos,autolayout,Macos,Autolayout,一个是给自动布局大师的:我不明白为什么下面的自动布局设置会阻止调整窗口的大小 我以这种方式组织了三种观点: ----------------- | | | | F | S | | | | ----------------- | B | ------------- S有一个固定的带,B有一个固定的高度,F应该总是有S的高度和B的宽度。 这是我在约束方面设置的: [self addConstraints:[NSLayo

一个是给自动布局大师的:我不明白为什么下面的自动布局设置会阻止调整窗口的大小

我以这种方式组织了三种观点:

-----------------
|           |   |
|     F     | S |
|           |   |
-----------------
|     B     |
-------------
S有一个固定的带,B有一个固定的高度,F应该总是有S的高度和B的宽度。 这是我在约束方面设置的:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[F(>=100)][S(==100)]|"
                                                             options:0
                                                             metrics:nil
                                                               views:@{ @"F": _f, @"S": _s }]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[F(>=100)][B(==100)]|"
                                                             options:0
                                                             metrics:nil
                                                               views:@{ @"F": _f, @"B": _b }]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[B(==F)]"
                                                             options:0
                                                             metrics:nil
                                                               views:@{ @"B": _b, @"F": _f }]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[S(==F)]"
                                                             options:0
                                                             metrics:nil
                                                               views:@{ @"S": _s, @"F": _f }]];
从我看事情的方式来看,这应该允许我自由调整窗口的大小,用F调整大小来填充空间。但这些约束完全锁定了窗口的大小调整

知道我做错了什么吗


谢谢

创建新约束时,默认优先级为1000(
NSLayoutPriorityRequired
)。这意味着自动布局引擎可能会影响窗口大小,以满足您的约束


如果将约束的优先级设置为小于500(
nslayoutPriorityWindowsSizeStayPut
),则应获得所需的行为。

我多次看到相同的基本问题,因为视图的
translatesAutoReshizingMackintoConstraints
属性之一为YES

这过去是由Xcode的UI编辑器中的复选框控制的,但在Xcode 6.1.1中,复选框不见了。但是,对于在代码中创建的视图(例如WKWebView,它不支持从.xib文件实例化),或者对于使用早期版本的Xcode创建的视图,此属性可能设置为“是”

如果是这样,则可能导致自动布局以意外的方式运行,通常包括窗口无法调整大小的症状。您已手动配置要随窗口调整大小的视图,但自动调整大小掩码到约束的自动转换可能会添加其他约束,如果窗口增大,则无法同时满足这些约束

为了说明,请考虑下面的方法。这将扩展NSView以添加一种方法,该方法可将另一个视图的大小调整为接收器的大小,将其添加为接收器的子视图,并设置自动布局约束,以便子视图随其超级视图(接收器)而增长和收缩

然而,我们注意到这里有一个bug,它通常工作正常,但有时包含所有视图的窗口将无法调整大小。原因是,在某些情况下,
subview.translatesAutoResizengMaskintoConstraints
是肯定的,这导致了不必要的额外布局约束,阻止了窗口调整大小。将第二行添加到最后一行修复了该错误

这可能就是您案例中发生的情况(取决于视图的创建方式)

实施NSView(Nakahara) -(无效)nakahara_子视图:(NSView*)子视图; { subview.frame=self.bounds; [自添加子视图:子视图]; NSArray*新约束= @[ [NSLayoutConstraint constraintWithItem:子视图属性:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:自身属性:NSLayoutAttributeTop乘数:1.0常量:0.0], [NSLayoutConstraint constraintWithItem:子视图属性:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:自身属性:NSLayoutAttributeWidth乘数:1.0常量:0.0], [NSLayoutConstraint constraintWithItem:子视图属性:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:自身属性:NSLayoutAttributeHeight乘数:1.0常量:0.0], [NSLayoutConstraint constraintWithItem:子视图属性:NSLayoutAttribute跟踪相关者:NSLayoutRelationEqual toItem:自属性:NSLayoutAttribute跟踪乘数:1.0常量:0.0], ]; subview.translatesAutoresizingMaskIntoConstraints=否; //重要信息!花了一段时间才弄清楚为什么有时有效,有时无效。这是因为subview.translatesAutoResizezingMaskinToConstraints有时是,有时不是,如果是,autolayout将以未定义的方式中断(例如,窗口突然变得不可执行)。 [自添加约束:新约束]; } @结束