0

我有一个垂直的 NSSplitView,底部子视图包含一个自定义视图(例如 NSView)和一个 NSTextView。

NSView 内部包含两个 NSButton。

当我调整 splitView 的大小,使其更小时,包含按钮的 NSView 也会调整大小。我不想要这种行为。

为了更好地解释我的问题,请查看附图。

图 1:应用程序启动时的窗口,一切正常

图 2:我调整了拆分视图的大小,只有一小部分按钮可见

图 3:我再次放大了拆分视图,但您可以看到 NSView 仍然更小,按钮不再可见(如果我将 splitView 的大小调整到 NSView 的底部“消失”)

在此处输入图像描述

4

2 回答 2

0

在我的情况下,限制分隔线的位置没有帮助,因为我正在为子视图设置动画,并且子视图可以折叠。

我设法通过实现 splitView 委托方法 -splitviewWillResizeSubviews 来实现可接受的解决方案:(意味着,您必须将委托属性从拆分视图连接到 IB 或代码中的控制器)通过将子视图设置为隐藏来保持最小宽度而不是将其缩小为零:

- (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;
        }
    }
}
于 2012-07-17T12:53:41.217 回答
0

这是一个基于 Cocoa 视图遗留工作的恶性问题。我见过的最好的解决方案是限制拆分视图任何部分的最小尺寸。如果子视图永远不会崩溃,它们的指标就不会跨越另一个维度,它们应该重新放大就可以了。

为此,请为您的拆分视图设置一个委托,该委托将实现- splitView:constrainMaxCoordinate:ofSubviewAt:. 拆分视图将调用您的委托方法,希望它可以将最大分隔符位置留在拆分视图的高度(将其作为第二个参数传入),但您可以简单地从该值中减去一些数量(例如,60)以返回它作为底视图的最小高度。

  - (CGFloat)splitView:(NSSplitView *)aSplitView
constrainMaxCoordinate:(CGFloat)proposedMin
           ofSubviewAt:(NSInteger)dividerIndex {

    return proposedMin - 60;
}

当然,您可能希望在此方法中进行更多检查,以确保您正在谈论正确的拆分视图和正确的子视图,以避免过度影响,但这是基本思想。

(另见这篇关于这个主题的精彩文章。)

于 2012-05-01T23:47:20.983 回答