【问题标题】:NSView frame set by means other than -setFrame: following autoresizing通过 -setFrame 以外的方式设置的 NSView 框架:在自动调整大小之后
【发布时间】:2015-04-11 00:42:49
【问题描述】:

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

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

然而,当窗口出现时,就好像后面的-setFrame: 调用没有持久效果——按钮的框架现在回到了A。这可以通过调试器中断并打印框架来验证——自动调整大小帧更新已恢复,但从未再次调用 -setFrame:

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

【问题讨论】:

    标签: cocoa nsview autoresizingmask


    【解决方案1】:

    它最初会在superviewsetFrameSize: 调整大小时发生,但更常见的是在调用superviewlayoutSubtreeIfNeeded 方法时发生,该方法又调用视图的resizeWithOldSuperviewSize:。您可以通过继承NSView(在您的情况下为NSButton)来覆盖它,并使用类似的空方法覆盖resizeWithOldSuperviewSize:

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

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

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

    &lt;id&gt; 将是您的 NSView 的实例,所以也许如果您有一个出口

    @property (weak) IBOutlet NSButton *myButton;
    

    然后你会设置

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      相关资源
      最近更新 更多