根据NSOutlineView高度动态调整NSWindow的大小

时间:2012-06-08 16:27:26

标签: macos cocoa nsview nswindow appkit

我已经阅读了很多关于动态调整NSWindows大小的问题的答案,但还没有任何工作有效。

我已经建立了一个' popover'就像在菜单栏中显示的窗口一样,我无法使用NSPopover,因为它在设计方面不够可定制。我的视图层次结构当前如下所示:

NSWindow Subclass
  - NSView (clears the titlebar rendering, draws popover arrow)
     - NSView (contentView)
        - NSOutlineView (main table of content)
        - NSView (window footer)

我需要的是窗口扩展和收缩NSOutlineView扩展和收缩中的项目,以便窗口始终精确地为顶部的轮廓视图,页脚和弹出箭头的正确高度。

我有方法根据内容计算大纲视图所需的高度。到目前为止,我一直在尝试重新计算在内容视图控制器上调用awakeFromNib时的大小,然后再次尝试重新计算委托方法outlineViewItemDidCollapse:outlineViewItemDidExpand:,但我永远无法调整大小正确的窗口。

我尝试了很多不同的方法,但都没有效果。是否有规范'这样做的方法?我已经看到有人在谈论-[NSWindow frameForContentRect:]与这类问题有关的问题,但我无法理解这是怎么回事。

也许我会以完全错误的方式解决这个问题,但我希望不是这样。看起来这应该是可能的,它只是在正确的地方找到正确的东西。不幸的是,GUI编程对我来说不是一个强项。我很感激人们的任何想法或解决方案。

感谢。

编辑:这已经解决,部分原因在于明确的答案,部分是由于其他一些原因。清除NSView没有自动调整大小的掩码,因此我将其设置为向所有方向扩展,这有助于解决一些调整大小问题。此外,我用于计算所需高度的方法并不完全正确,并且存在一些问题。

根据提供的答案,找到所需高度的方法在某些情况下是好的,但我没有“根”'可以测量的项目。这是可能需要考虑的事情。

2 个答案:

答案 0 :(得分:2)

这是我的方法,它运作得很好,但可能比那更好。

- (void)outlineViewItemDidExpand:(NSNotification *)notification {
    [self resizeWindowHeight];
}
- (void)outlineViewItemDidCollapse:(NSNotification *)notification {
    [self resizeWindowHeight];
}
- (void)resizeWindowHeight {
    NSRect wRect = [myWindow frame];
    NSRect oRect = [myoutlineView rectOfRow:([myoutlineView numberOfRows] - 1)]; //get rect of last row
    CGFloat n = oRect.origin.y + oRect.size.height + 22;
    wRect.origin.y = wRect.origin.y + (wRect.size.height - n);
    wRect.size.height = n;
    [myWindow setFrame:wRect display:YES animate:YES];
}

数字 22 是以下之和:(顶部窗口 - 顶部轮廓)+ Outline标题的高度+水平滚动条的高度+(底部窗口 - 底部轮廓)+工具栏的高度

此示例中 IB 的设置:没有水平滚动条,没有标题,Outline的高度=窗口contentView的高度,因此22是窗口边框。

如果您有工具栏或水平滚动条自动隐藏,您需要在代码中添加条件以检查(工具栏和滚动条)的可见性并相应地更改高度。

答案 1 :(得分:0)

一种方法是记录轮廓视图的初始高度和窗口的初始高度,然后,随着轮廓视图高度的变化,计算窗口的新高度=旧高度+(新轮廓高度 - 旧轮廓高度)。通过仅从初始状态的变化开始工作,它使事情变得更加灵活。您不必像在从头开始重新计算事物大小那样在代码中复制整个布局。您可以使用IB布局窗口,它应该保留该布局,而代码不必了解具体细节。您可以在IB中更新布局,代码仍然有效。

否则,我建议您展示您尝试过的内容并解释它是不对的。

相关问题