Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 根据NSOutlineView高度动态调整NSWindow的大小_Macos_Cocoa_Nsview_Nswindow_Appkit - Fatal编程技术网

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

Macos 根据NSOutlineView高度动态调整NSWindow的大小,macos,cocoa,nsview,nswindow,appkit,Macos,Cocoa,Nsview,Nswindow,Appkit,我已经阅读了许多关于动态调整NSWindows大小的问题的答案,但还没有什么有效的方法 我已经构建了一个类似于“popover”的窗口,可以从菜单栏中显示,但我不能使用NSPopover,因为它在设计上不够可定制。我的当前视图层次结构如下所示: NSWindow Subclass - NSView (clears the titlebar rendering, draws popover arrow) - NSView (contentView) - NSOutli

我已经阅读了许多关于动态调整NSWindows大小的问题的答案,但还没有什么有效的方法

我已经构建了一个类似于“popover”的窗口,可以从菜单栏中显示,但我不能使用NSPopover,因为它在设计上不够可定制。我的当前视图层次结构如下所示:

NSWindow Subclass
  - NSView (clears the titlebar rendering, draws popover arrow)
     - NSView (contentView)
        - NSOutlineView (main table of content)
        - NSView (window footer)
我需要的是让窗口与NSOutline视图中的项目展开和收缩展开和收缩,以便窗口始终精确地保持轮廓视图、页脚和顶部的弹出箭头的正确高度

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

我尝试了很多不同的方法,但都没有成功。有没有一种“规范”的方法可以做到这一点?我见过有人谈论与这类问题相关的
-[NSWindow frameForContentRect:
,但我不太清楚这是如何需要的

也许我完全走错了方向,我希望不是这样。看起来这应该是可能的,它只是在正确的地方得到正确的东西。不幸的是,GUI编程不是我的强项。我将非常感谢人们提出的任何想法或解决方案

谢谢

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


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

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


否则,我建议你展示你所尝试的,并解释它是如何不正确的。

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

- (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中的我的设置本例:没有水平滚动条和标题,轮廓高度=窗口内容视图的高度,因此22是窗口边框


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

好,这很好。我几乎把一切都搞定了。现在的主要问题是,在NSOutlineView中发生更改之前,窗口会更改帧,理想情况下,这些更改需要同步。你知道怎么做吗?我通过调用
setFrame:display:animate:
call“dispatch\u async”几乎实现了同步。只要换一点零钱就行了。它现在工作得很好,但动画的时间安排不太恰当,这意味着有一些图形抖动,我真的不喜欢。你对我能做些什么来阻止这种情况有什么建议吗?好的,我用一个大的层次结构(多列)进行了测试。当我折叠一个项目时,我看到项目在调整窗口大小的同时被折叠,我在扩展项目时没有问题。所以有了这个,我就没有这个问题了<代码>-(void)outlineViewItemDidCollapse:(NSNotification*)通知{[self-performSelector:@selector(resizeWindowHeight)withObject:nil afterDelay:0.1]我不知道这是否与分派不同。谢谢你的想法,我会尝试一下。由于实际问题现已解决,我已将此标记为答案,但我会在找到答案后更新问题的更多细节。感谢所有帮助。