【问题标题】:Inconsistent state of NSSplitViewNSSplitView 状态不一致
【发布时间】:2014-11-11 00:06:44
【问题描述】:

我正在使用 NSSplitView - 现在非常成功,但这是我的问题:

我的 SplitView 如下所示:

在这里测试项目:https://www.dropbox.com/s/amz863l11nvkdir/TestNSSplitView.zip

我已经实现了- (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize,以便在调整大小时将左右子视图保持与以前相同的大小。

如果我打开包含 NSSplitView 的窗口,控制台中会出现此消息:

<NSSplitView: 0x107de1520>: the delegate <BRSchematicWindowController: 0x10ac11050> was sent -splitView:resizeSubviewsWithOldSize: and left the subview frames in an inconsistent state:
Split view bounds: {{0, 0}, {1068, 600}}
     Subview frame: {{0, 0}, {182, 600}}
     Subview frame: {{183, 0}, {640, 600}}
     Subview frame: {{824, 0}, {243, 600}}
The outer edges of the subview frames are supposed to line up with the split view's bounds' edges. NSSplitView is working around the problem, perhaps at the cost of more redrawing. (This message is only logged once per NSSplitView.)

这里有什么问题?看完这条消息我还是没明白...

PS:在右侧 splitView 中还有另一个 NSSplitView 这不是失败。即使没有这个额外的 NSSplitView,我也会收到此消息。

【问题讨论】:

  • +1 用于测试项目 ;)
  • 我不想这么说,因为在 99.999999 % 的情况下这是错误的,但我认为这是一个错误。即使您在没有任何内容的情况下调用该方法,它也会记录消息...
  • 嗯,我不满意。如果我调查正确,那么这是我唯一可以这样做的地方。
  • 当你调整窗口大小时,最左边的子视图和最右边的子视图保持相同的宽度,只有中间的子视图变宽或变窄是期望的行为吗?
  • 您希望支持的最低 OS X 版本是多少? 10.6 及更高版本,还是需要 10.5 支持?

标签: objective-c xcode cocoa nssplitview


【解决方案1】:

如果您的目标是 OS X 10.6+,那么使用NSSplitViewsplitView:shouldAdjustSizeOfSubview: 来控制大小要容易得多。

使用此方法的一种方法是将以下 IBOutlets 添加到您的 .h 文件中:

@property (nonatomic, weak) IBOutlet NSView *leftView;
@property (nonatomic, weak) IBOutlet NSView *centerView;
@property (nonatomic, weak) IBOutlet NSView *rightView;

然后像这样在你的 .m 文件中实现splitView:shouldAdjustSizeOfSubview:

- (BOOL)splitView:(NSSplitView *)aSplitView
             shouldAdjustSizeOfSubview:(NSView *)subview {
    return (subview == _centerView);
    // or return !(subview == _leftView || subview == _rightView);
}

通过实现它,你基本上说“调整大小时只调整中心子视图的大小”。

你可以暂时注释掉整个splitView:resizeSubviewsWithOldSize:方法,除非你需要以某种方式自定义默认行为。

请注意,如果您有多个拆分视图将此控制器对象设置为它们的委托,您可能需要检查在 aSplitView 参数中传递的拆分视图并相应地执行不同的操作。

【讨论】:

  • 哇!我一直在努力 resizeSubviewsWithOldSize 很长一段时间,我什至不知道这种方法。我应该更仔细地阅读文档。这比 resizeSubviewsWithOldSize 的所有其他疯狂实现要简单得多。
  • 很棒的答案。顺便说一句,如果您知道要允许调整大小的子视图的索引,则无需制作插座,只需说 return subview == [aSplitView subviews][1];
  • 我希望我能给你这个答案的人一百分!你完全让我开心!! jsd 的评论使它成为一个包装。
  • 老兄,你刚刚治好了 6 小时的头痛!
猜你喜欢
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
相关资源
最近更新 更多