gpt4 book ai didi

macos - OS X 自动布局可防止调整窗口大小

转载 作者:行者123 更新时间:2023-12-01 23:00:00 24 4
gpt4 key购买 nike

献给自动布局专家:我不明白为什么以下自动布局设置会阻止调整窗口大小。

我以这种方式组织了三个 View :

-----------------
| | |
| 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 调整大小来填充空间。但约束完全锁定了窗口大小的调整。

知道我做错了什么吗?

谢谢

最佳答案

我已经多次看到同样的基本问题出现,因为 View 的 translatesAutoresizingMaskIntoConstraints 属性之一为 YES。

这曾经是由 Xcode UI 编辑器中的复选框控制的,但在 Xcode 6.1.1 中该复选框已消失。但是,对于在代码中创建的 View (例如 WKWebView,它不支持从 .xib 文件实例化),或者对于使用早期版本的 Xcode 创建的 View ,此属性可能设置为 YES。

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

为了说明这一点,请考虑以下方法。这扩展了 NSView 以添加一个方法,该方法可以将另一个 View 的大小调整为接收器的大小,将其添加为接收器的 subview ,并设置自动布局约束,以便 subview 与其父 View (接收器)一起增长和缩小。

但是,我们注意到这里有一个错误,它通常可以正常工作,但有时包含所有 View 的窗口将变得无法调整大小。原因是,在某些情况下,subview.translatesAutoresizingMaskIntoConstraints 为"is",这会导致不必要的额外布局约束,从而阻止窗口调整大小。添加倒数第二行修复了该错误。

这可能就是您的情况所发生的情况(取决于您的 View 的创建方式)。

@implementation NSView (Nakahara)

- (void)nakahara_embedSubview:(NSView *)subview;
{
subview.frame = self.bounds;
[self addSubview:subview];

NSArray *newConstraints =
@[
[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0],
[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0],
[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0],
[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0.0],
];

subview.translatesAutoresizingMaskIntoConstraints = NO;
// IMPORTANT! It took a while to figure out why this was sometimes working and sometimes not. It was because subview.translatesAutoresizingMaskIntoConstraints is sometimes YES and sometimes NO, and if it is YES, autolayout will break in undefined ways (e.g., windows suddenly become unresizable).

[self addConstraints:newConstraints];
}


@end

关于macos - OS X 自动布局可防止调整窗口大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20804179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com