【问题标题】:How do I fix the height of my view after collapsing NSSplitView?折叠 NSSplitView 后如何修复视图的高度?
【发布时间】:2012-07-17 20:50:22
【问题描述】:

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

折叠前:

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

【问题讨论】:

    标签: cocoa height nsview nssplitview


    【解决方案1】:

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

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

    这是split view documentation的链接。

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

    如果您想查看这方面的示例,Mac OS X 的 Mail.app 会在达到特定高度时将其内联消息视图关闭。你应该模仿这种行为。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,这实际上是我最终做的。 BWToolkit 的拆分视图实际上存在一些错误,但已在 1.2.5 版本中修复
      【解决方案3】:

      你可以通过 NSUserDefaults “重置”一些东西,可能......有诸如 NSSplitView Subview Frames 之类的键,你可以为其分配坐标,例如 0.000000, 0.000000, 0.000000, 720.000000, NO

      【讨论】:

        【解决方案4】:

        虽然 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;
                    }
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-29
          • 2011-08-22
          • 1970-01-01
          • 2016-03-14
          相关资源
          最近更新 更多