2

我的应用程序通过NSWindowController. 在-windowDidLoad中,我根据窗口大小以编程方式设置按钮的框架,这取决于哪些按钮可见)。在 XIB 中为这些按钮适当地设置了自动调整大小的蒙版。问题是当窗口实际出现时,按钮看起来好像没有应用自动调整大小。

在调试这个问题时,我在调用 super's 后NSButton继承并覆盖-setFrame:以打印 frame ( ) 。使用它,我观察到框架设置了两次:首先是通过我的编程布局代码(调用此框架 A),然后一旦 Cocoa 根据用户偏好调整窗口大小(应用自动调整大小掩码,将框架设置为 B)。这些框架看起来都正确。[self frame]-setFrame:

然而,当窗口出现时,就好像后一个-setFrame:调用没有持久的效果——按钮的框架现在回到了 A。这通过在调试器中中断并打印框架来验证——自动调整框架的更新已经恢复,但-setFrame:再也没有被叫过。

关于我为什么会看到这种行为的任何想法?

4

1 回答 1

0

它最初会在superview被调整大小setFrameSize:时发生,但更常见的是在调用superview'layoutSubtreeIfNeeded方法时发生,而后者又会调用视图的resizeWithOldSuperviewSize:. 您可以通过子类化NSView, 在您的情况下NSButton,并resizeWithOldSuperviewSize:使用空方法覆盖来覆盖它

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

但是,您也可以通过声明您不希望NSView自动布局系统调整大小来更优雅地解决问题。您可以通过以下方式做到这一点:

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

<id>你的实例在哪里NSView,所以如果你有一个出口

@property (weak) IBOutlet NSButton *myButton;

那么你会设置

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

setFrame:然后用你想要的框架调用。第一行声明视图不是可调整大小的,而第二行声明掩码应该被自动布局系统视为一个约束。希望有帮助!

编辑: 对不起,出于某种原因,我将您的问题读作与我建议的相反,自动布局正在覆盖您的更改。但是,您想知道相反的情况。如果您正在使用setAutoresizingMask:,您尝试过setTranslatesAutoresizingMaskIntoConstraints:YES吗?如果您可以发布一个最小的工作示例,这也会有所帮助。

于 2015-04-10T16:22:58.477 回答