Cocoa 折叠NSSplitView后,如何固定视图的高度?

Cocoa 折叠NSSplitView后,如何固定视图的高度?,cocoa,height,nsview,nssplitview,Cocoa,Height,Nsview,Nssplitview,我有一个NSSplitView,底部视图中有一个NSScrollView。问题是,当我折叠,然后重新打开(取消折叠)底部视图时,滚动视图的高度超出了该底部视图的高度,因此正在剪裁scoll视图的顶部。在IB中,我已将滚动视图和分割视图设置为在所有方向上自动调整大小。取消折叠后,我是否需要调整该滚动视图的高度,或者我是否将调整大小属性设置错误,或者其他什么?下面是剪辑前后的图像 崩溃前: 折叠并重新打开后(请注意底部视图中的滚动条已被剪裁) 问题源于这样一个事实:cocoa自动调整大小规则通过将

我有一个NSSplitView,底部视图中有一个NSScrollView。问题是,当我折叠,然后重新打开(取消折叠)底部视图时,滚动视图的高度超出了该底部视图的高度,因此正在剪裁scoll视图的顶部。在IB中,我已将滚动视图和分割视图设置为在所有方向上自动调整大小。取消折叠后,我是否需要调整该滚动视图的高度,或者我是否将调整大小属性设置错误,或者其他什么?下面是剪辑前后的图像

崩溃前:

折叠并重新打开后(请注意底部视图中的滚动条已被剪裁)


问题源于这样一个事实:cocoa自动调整大小规则通过将增量从以前的状态调整到当前状态来工作。如果任何边距变为0,它们将永远不会随着视图的增长而向上缩放,因为缩放的多应用性

解决此问题的典型方法是使用NSSplitView委托方法来防止拆分视图变小,然后将其捕捉关闭-这在内部将折叠视图保持在最小大小

这里有一个链接到

此外,如果您考虑用户体验,当视图的大小缩小到某个点以下时,您的视图可能看起来非常糟糕-视图可能开始重叠,并且变得太小而无法显示其内容。添加此捕捉折叠行为可以解决这两个问题


如果你想看一个这样的例子,Mac OS X的Mail.app会在到达某个高度时关闭其内联消息视图。你应该模仿那种行为。

我也有同样的问题。使用BWToolkit的拆分视图修复了此问题,该视图允许您确定每个视图的最大和最小高度。

您可以通过NSUserDefaults(可能)来“重置”内容。。有一些关键点,如
NSSplitView子视图框架等,您可以为其指定坐标,la
0.000000、0.000000、0.000000、720.000000、NO

,而Jon Hess可以很好地描述问题(一旦子视图的宽度变为0,自动宽度元素的自动大小信息就会丢失),并非所有情况下都给出了解决方案。 在我的例子中,约束宽度没有帮助,因为子视图可以折叠

通过实现splitView委托方法-splitviewWillResizeSubviews,我成功地实现了一个可接受的解决方案:通过将子视图设置为hidden(隐藏)而不是将其收缩为零来保持最小宽度:

- (void)splitViewWillResizeSubviews:(NSNotification *)notification {
        NSUInteger divider = [[[notification userInfo] valueForKey:@"NSSplitViewDividerIndex"] intValue];
        NSView *subview = nil;
        if(divider == SPLITVIEW_DIVIDER_SIDEBAR) {
            subview = (NSView*)[self.splitView.subviews objectAtIndex:SPLITVIEW_SIDEBAR_INDEX];
        }
        if(subview) {
            if(subview.frame.size.width < SPLITVIEW_MINIMUM_SIDEBAR_WIDTH) {
                CGRect correctedFrame = subview.frame;
                correctedFrame.size.width = SPLITVIEW_MINIMUM_SIDEBAR_WIDTH;
                subview.frame = correctedFrame;
                subview.hidden = YES;
            } else {
                subview.hidden = NO;
            }
        }
    }
-(void)splitViewWillResizeSubviews:(NSNotification*)通知{
NSU整数除法器=[[notification userInfo]valueForKey:@“NSSplitViewDividerIndex”]intValue];
NSView*子视图=零;
if(分隔符==分隔视图\分隔符\侧栏){
子视图=(NSView*)[self.splitView.subviews objectAtIndex:splitView_边栏_索引];
}
如果(子视图){
if(子视图.frame.size.width<拆分视图\u最小值\u侧边栏\u宽度){
CGRect correctedFrame=子视图.frame;
更正的frame.size.width=拆分视图\最小\侧栏\宽度;
subview.frame=correctedFrame;
subview.hidden=是;
}否则{
subview.hidden=否;
}
}
}

是的,这就是我最后要做的。实际上,BWToolkit的拆分视图中存在一些错误,但在版本1.2.5中已经修复