macos - 随着窗口变小,OSX 自动布局无法重绘某些控件

标签 macos cocoa autolayout

我有一个使用自动布局的 View 的 xib 文件。随着 View 变大,沿着窗口下边缘放置的 3 个按钮都会按预期向下移动,与窗口下边缘保持恒定的距离。但随着窗口变小,三个按钮不会移动,最终消失,只有当窗口变大(即使是最小的量)时,它们才会重新绘制。下面的动画 gif 显示了它的外观。 更新:这是一个较新的屏幕截图。请注意,随着窗口大小的调整,不仅按钮而且分段控件都无法正确绘制。

enter image description here

限制是我一直关注的地方。例如,标记为“检查全部”的按钮有 2 个与其垂直位置相关的约束。另外两个与前沿放置有关,我没有将它们包含在这里。

评论者要求我提供有关限制的详细信息。第一张图显示了“全部检查”按钮上的限制。 (另一个按钮也有类似的限制。)。约束条件都是优先级 1000,与原始帖子中的略有不同。

enter image description here

下一张屏幕截图显示了“全部检查”按钮上方表格中的约束。

enter image description here

我在应用程序委托(delegate)上有以下代码:

- (void) windowDidResize: (NSNotification *) notification
{
    _masterViewController.view.frame = ((NSView*)_window.contentView).bounds;
}

如果我显式向此方法添加代码以重绘未正确绘制的按钮和分段控件,则一切看起来都很棒。这可以解决问题,但仍然无法解释为什么会发生这种情况。 更新:它告诉我这可能不是我最初怀疑的自动布局问题,而是与重绘周期有关。

有人知道为什么会出现这样的行为吗?

最佳答案

在您的代码中,无论您在何处执行与 [_window.contentView addSubview:_masterViewController.view] 等效的操作,您都应该执行以下操作:

[_window.contentView addSubview:_masterViewController.view];
_masterViewController.view.translatesAutoresizingMaskIntoConstraints = NO; // optional if you already turned it off in the NIB
NSDictionary* views = @{ @"view": _masterViewController.view };
NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[view]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:views];
[_window.contentView addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|"
                                                      options:0
                                                      metrics:nil
                                                        views:views];
[_window.contentView addConstraints:constraints];

这些约束将使 _masterViewController.view 保持填充窗口的内容 View 。

关于macos - 随着窗口变小,OSX 自动布局无法重绘某些控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856180/

相关文章:

swift - NetService 无法发布

macos - 我可以让复选框在发送其操作之前直观地更改其状态吗?

objective-c - 可拖动的 NSWindow 闪烁

ios - 如何使用自动调整高度的 SnapKit 以编程方式创建 UITableViewCell?

mysql - 错误 1045 (28000) : Access denied for user 'root' @'localhost' while starting MYSQL

postgresql - 如何在 Mac 上设置/重置 PostgreSQL 密码?

ios - 仅限 UIScrollView AutoLayout 垂直

ios - 在自动布局中动态更改 UIScrollView 的大小

c++ - 如何在VSCode上调试C++代码?苹果系统

macos - 使用 Swift 设置 NSSplitViewController Pane 的宽度