gpt4 book ai didi

cocoa - NSView 框架通过 -setFrame : following autoresizing 以外的方式设置

转载 作者:行者123 更新时间:2023-12-03 16:47:03 26 4
gpt4 key购买 nike

我的应用程序通过 NSWindowController 从 XIB 文件加载一个窗口和该窗口中的按钮。在 -windowDidLoad 中,我根据窗口的大小以编程方式设置按钮的框架,窗口的大小可以根据哪些按钮可见而变化)。在 XIB 中为这些按钮适当设置自动调整大小蒙版。问题是,当窗口实际出现时,按钮看起来好像没有应用自动调整大小。

在调试此问题时,我对 NSButton 进行了子类化并覆盖了 -setFrame: 以在调用 super 后打印框架 ([self frame]) -setFrame:。使用它,我观察到框架被设置了两次:首先是由我的编程布局代码(将此框架称为 A),然后是 Cocoa 根据用户首选项调整窗口大小(应用自动调整大小蒙版,将框架设置为 B)。这些框架看起来都是正确的。

但是,当窗口出现时,后一个 -setFrame: 调用似乎没有持久效果 - 按钮的框架现在回到 A。这是通过中断调试器来验证的并打印帧 - 自动调整大小帧更新已恢复,但从未再次调用 -setFrame:

关于为什么我可能会看到这种行为有什么想法吗?

最佳答案

它最初会在 superview 时发生。正在调整大小 setFrameSize:但更常见的情况是当 superviewlayoutSubtreeIfNeeded方法被调用,该方法又调用 View 的 resizeWithOldSuperviewSize: 。您可以通过子类化 NSView 来覆盖它,在你的情况下NSButton ,并覆盖resizeWithOldSuperviewSize:使用空方法,例如

- (void)resizeWithOldSuperviewSize:(NSSize)oldSize {}

但是,您也可以通过声明您不想要 NSView 来更优雅地解决问题。由自动布局系统调整大小。您可以通过以下方式执行此操作:

[<id> setAutoresizingMask:NSViewNotSizable];
[<id> setTranslatesAutoresizingMaskIntoConstraints:YES];

哪里<id>将是您的 NSView 的实例,所以也许如果你有一个 socket

@property (weak) IBOutlet NSButton *myButton;

然后你就可以设置

[self.myButton setAutoresizingMask:NSViewNotSizable];
[self.myButton setTranslatesAutoresizingMaskIntoConstraints:YES];

随后调用setFrame:与您想要的框架。第一行指出 View 的大小不可调整,而第二行指出 mask 应被自动布局系统视为约束。希望有帮助!

编辑:抱歉,出于某种原因,我将您的问题理解为与我的建议相反的问题,即自动布局会覆盖您的更改。然而,您想知道相反的情况。如果您使用setAutoresizingMask:你试过吗setTranslatesAutoresizingMaskIntoConstraints:YES ?如果您可以发布一个最小的工作示例,也会很有帮助。

关于cocoa - NSView 框架通过 -setFrame : following autoresizing 以外的方式设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12413784/

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