折叠NSSplitView后如何修复视图的高度?

时间:2009-08-08 12:52:17

标签: cocoa height nsview nssplitview

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

折叠前:

alt text

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

alt text

4 个答案:

答案 0 :(得分:4)

问题源于可可自动化规则通过将增量从先前状态缩放到当前状态来工作。如果任何边距变为0,由于缩放的同义性,它们将永远不会随着视图的增长而缩放。

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

以下是split view documentation的链接。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以通过NSUserDefaults“重置”某些内容,可能是.. NSSplitView Subview Frames之类的内容,您可以为其分配坐标,la 0.000000, 0.000000, 0.000000, 720.000000, NO

答案 3 :(得分:0)

虽然Jon Hess可以很好地描述问题(一旦子视图的宽度变为0,自动调整信息就会因自动宽度元素而丢失),但并不是所有情况都能给出解决方案。 在我的情况下,限制宽度没有帮助,因为子视图可​​以折叠。

我设法通过实现splitView委托方法-splitviewWillResizeSubviews来实现一个可接受的解决方案:通过将子视图设置为隐藏而不是将其缩小为零来维持最小宽度:

- (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;
            }
        }
    }