我的应用程序通过NSWindowController
从XIB文件加载该窗口中的窗口和按钮。在-windowDidLoad
中,我根据窗口的大小以编程方式设置按钮的帧,这可以根据哪些按钮可见而变化。对于这些按钮,在XIB中适当地设置自动调整掩码。问题是,当窗口实际出现时,按钮看起来好像没有应用自动调整大小。
在调试此问题时,我在调用super NSButton
之后将-setFrame:
子类化并覆盖[self frame]
以打印帧(-setFrame:
)。使用这个我观察到框架被设置两次:首先是我的程序化布局代码(调用此框架A),然后一旦Cocoa根据用户首选项调整窗口大小(应用自动调整遮罩,将框架设置为B)。这些框架看起来都很正确。
然而,当窗口出现时,就好像后面的-setFrame:
调用没有持久效果 - 按钮的框架现在又回到A.这可以通过打破调试器并打印框架来验证 - 已恢复自动调整大小的帧更新,但从未再次调用-setFrame:
。
关于为什么我会看到这种行为的任何想法?
答案 0 :(得分: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
?如果您可以发布一个最小的工作示例,也会有所帮助。