代码之家  ›  专栏  ›  技术社区  ›  Austin

如何在折叠nssplitview后固定视图的高度?

  •  2
  • Austin  · 技术社区  · 17 年前

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

    折叠前:

    alt text

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

    alt text

    4 回复  |  直到 14 年前
        1
  •  0
  •   ruipacheco    16 年前

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

        2
  •  4
  •   Jon Hess    17 年前

    这个问题源于这样一个事实:Cocoa自动调整规则通过将delta从以前的状态调整到当前状态来工作。如果任何一个页边距变为0,它们将永远不会随着视图的增长而进行缩放,因为缩放的复杂性。

    解决这一问题的典型方法是使用nssplitview委托方法,以防止拆分视图变小,然后使其快速关闭,从而在内部将折叠视图保持在最小大小。

    这里有一个链接指向 split view documentation .

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

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

        3
  •  0
  •   Alex Gray    14 年前

    你可以通过nsuserdefaults“重置”东西,可能……有些事情的关键是 NSSplitView Subview Frames 等等,你可以给它分配坐标,一个LA 0.000000, 0.000000, 0.000000, 720.000000, NO

        4
  •  0
  •   auco    14 年前

    虽然JonHess可以很好地描述这个问题(一旦子视图的宽度变为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;
                }
            }
        }