NSSplitView:在视网膜屏幕上拖动期间分隔线厚度发生变化

NSSplitView: Divider Thickness changes during drag on retina screens

上下文

我的应用程序中有一个 NSSplitView,它有 3 个窗格。我已经将 NSSplitView 子类化,它有一个覆盖:

-(CGFloat) dividerThickness { return 1.0f; }

我禁用了所有约束分隔符 min/max 点和调整子视图大小等的委托方法


问题

当我在视网膜屏幕上拖动任何分隔线时,分隔线的厚度在拖动过程中波动。观看此视频:http://incident57.com/divider.mp4

无论我使用何种厚度的分隔线都会发生这种情况——在拖动过程中厚度总是变化大约 1px。

在非视网膜屏幕上不会发生。它也 不会发生 当 window 本身被调整大小时。分隔线宽度只有在拖动分隔线本身时才会波动。

(如果你仔细观察,你会发现视图之间有一些空白 space 看起来像 NSSplitView 应该 绘制分隔线,但不是。请查看视频中棕色所选 table 行的末尾。)


我需要什么

如何解决此问题,以便在视网膜屏幕上拖动时分隔线宽度保持不变?

我通过实现这个 NSSplitViewDelegate 方法解决了这个问题:

- (CGFloat) splitView:(NSSplitView *)splitView constrainSplitPosition:(CGFloat)proposedPosition ofSubviewAt:(NSInteger)dividerIndex
{
    return floor(proposedPosition);
}

还值得指出的是,此问题仅在 NSSplitView 窗格中的子视图为 NSScrollView 时才会出现。窗格内的正常 NSViews 不会导致分隔线宽度波动。

分层支持拆分视图(即 [splitView setWantsLayer:YES])也应该解决这个问题。 由于滚动视图通常会自己自动分层,因此当非点对齐时,它们的层与绘制的拆分视图分隔线重叠。