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

2024-04-21

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

我已经构建了一个类似“弹出窗口”的窗口,从菜单栏显示,我无法使用 NSPopover,因为它在设计方面的可定制性不够。我的视图层次结构当前如下所示:

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

我需要的是窗口随着 NSOutlineView 中项目的扩展和收缩而扩展和收缩,以便窗口始终精确地为大纲视图、页脚和顶部的弹出窗口箭头提供正确的高度。

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

我尝试了很多不同的方法,但没有一个有效。有没有“规范”的方法来做到这一点?我见过人们在谈论-[NSWindow frameForContentRect:]关于这类问题,但我不太清楚这是如何需要的。

也许我的处理方式完全错误,但我希望不是。看起来这应该是可能的,只是把正确的东西放在正确的地方。不幸的是 GUI 编程对我来说不是强项。我将不胜感激人们的任何想法或解决方案。

Thanks.

Edit:这个问题得到了解决,部分原因是标记的答案,部分原因是其他一些事情。清除 NSView 没有自动调整大小蒙版,因此我将其设置为向各个方向扩展,这有助于解决一些调整大小问题。另外,我用来计算所需高度的方法并不完全正确,并且存在一些问题。

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


这是我的方法,它非常有效,但可能还有比这更好的方法。

- (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是以下总和:(顶部窗口 - 顶部大纲)+ 大纲标题高度 + 水平滚动条高度 + (底部窗口 - 底部大纲)+ 工具栏高度

我的设置在IB对于这个例子:没有水平滚动,没有标题,Outline的高度=窗口内容视图的高度,所以22是窗口边框。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据 NSOutlineView 高度动态调整 NSWindow 大小 的相关文章

随机推荐