我在底部视图中有一个带有 NSScrollView 的 NSSplitView。问题是当我折叠,然后重新打开(取消折叠)底部视图时,滚动视图的高度超出了底部视图的高度,因此 scoll 视图的顶部被剪裁了。我已经将滚动视图和拆分视图设置为在 IB 的各个方向上自动调整大小。我是否需要在取消折叠后调整该滚动视图的高度,或者我是否设置了错误的调整大小属性,或者其他什么?下面是剪辑前后的图像。
折叠前:
折叠并重新打开后(注意底部视图中的滚动条被剪掉了)
我在底部视图中有一个带有 NSScrollView 的 NSSplitView。问题是当我折叠,然后重新打开(取消折叠)底部视图时,滚动视图的高度超出了底部视图的高度,因此 scoll 视图的顶部被剪裁了。我已经将滚动视图和拆分视图设置为在 IB 的各个方向上自动调整大小。我是否需要在取消折叠后调整该滚动视图的高度,或者我是否设置了错误的调整大小属性,或者其他什么?下面是剪辑前后的图像。
折叠前:
折叠并重新打开后(注意底部视图中的滚动条被剪掉了)
问题源于可可自动调整大小规则通过将增量从先前状态缩放到当前状态来工作。如果任何边距变为 0,由于缩放的乘法性质,它们将永远不会随着视图的增长而缩放。
解决此问题的典型方法是使用 NSSplitView 委托方法来防止拆分视图变小,然后将其关闭 - 这在内部将折叠视图保持在最小尺寸。
这是拆分视图文档的链接。
此外,如果您考虑用户体验,当您的视图缩小到某个点以下时,它们可能看起来非常糟糕——视图可能开始重叠,并且变得太小而无法显示其内容。添加这种捕捉折叠行为解决了这两个问题。
如果你想看一个这样的例子,Mac OS X 的 Mail.app 会在它达到一定高度时将其内联消息视图关闭。你应该模仿这种行为。
我也有同样的问题。使用 BWToolkit 的拆分视图修复它,它允许您确定每个视图的最大和最小高度。
NSSplitView Subview Frames
您可以通过NSUserDefaults “重置”事物,可能......0.000000, 0.000000, 0.000000, 720.000000, NO
虽然 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;
}
}
}