NSSplitView调整包含的自定义NSView的大小

时间:2012-05-01 14:01:15

标签: cocoa nssplitview

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

NSView里面包含两个NSButtons。

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

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

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

图片2:我调整了分割视图的大小,只显示了一小部分按钮

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

enter image description here

2 个答案:

答案 0 :(得分:0)

这是一个基于Cocoa视图遗留工作的恶性问题。我见过的最好的解决方案是约束分割视图任何部分的最小尺寸。如果子视图永远不会崩溃,他们的指标就不会进入另一个维度,他们应该重新放大。

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

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

    return proposedMin - 60;
}

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

(另请参阅this fabulicious article有关该主题。)

答案 1 :(得分:0)

在我的情况下,约束分隔符位置没有帮助,因为我正在动画子视图和子视图可以折叠。

我设法通过实现splitView委托方法-splitviewWillResizeSubviews来实现可接受的解决方案:(意味着,您必须将分割视图中的委托属性连接到IB或代码中的控制器)以通过设置subview to 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;
        }
    }
}