【问题标题】:NSSplitView resizes the custom NSView containedNSSplitView 调整包含的自定义 NSView 的大小
【发布时间】:2012-05-01 14:01:14
【问题描述】:

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

NSView 内部包含两个 NSButton。

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

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

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

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

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

【问题讨论】:

    标签: cocoa nssplitview


    【解决方案1】:

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

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

      - (CGFloat)splitView:(NSSplitView *)aSplitView
    constrainMaxCoordinate:(CGFloat)proposedMin
               ofSubviewAt:(NSInteger)dividerIndex {
    
        return proposedMin - 60;
    }
    

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

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

    【讨论】:

    • 我使用动画折叠拆分视图,因此约束没有太大帮助,但现在多亏了你,我有了一个可以遵循的方向。很奇怪,当我删除 NSTextView 时 NSView 没有调整大小
    • 我想你的意思是 constrainMinCoordinate 不是吗?
    • 其实constrainMinCoordinate限制了divider的最小坐标,而不是任何特定子视图的大小。因此,视图上方分隔线的最大坐标用于定义该视图的最小高度。令人困惑,是的。
    【解决方案2】:

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

    我设法通过实现 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多