我正在为macOS开发可可应用程序。我需要两个NSOutlineView进行滚动同步。我遵循了众所周知的Apple example,并且效果很好。我想向代码中添加水平滚动,因此我将这一行代码添加到了NSScrollView子类中:
newOffset.x = changedBoundsOrigin.x;
之后:
newOffset.y = changedBoundsOrigin.y;
它工作得很好,假设目前,我假设两个列的NSOutlineView宽度在两个NSOutlineViews之间是相等的。问题是,当水平滚动时,另一个NSOutlineView的NSOutlineView标头不同步,因此它们不会跟随。有什么想法吗?
我已经找到了一个可行的解决方案,目前对我来说是有益的,直到我实现了使列宽也保持同步的代码。我找到的解决方案如下:
在Apple提供的NSScrollView子类中,声明两个IBOutlet,分别引用左侧的NSTableHeaderView和右侧的NSTableHeaderView。这在Interface Builder中有点棘手,因为您必须首先在界面中创建出口,如下所示:
@property (assign) IBOutlet NSTableHeaderView *leftOutLineHeaderView;
@property (assign) IBOutlet NSTableHeaderView *rightOutLineHeaderView;
然后您在新窗口中打开接口文件,并从接口文件中的圆圈开始连接插座。请注意,如果您尝试从IB自动创建无效的出口,则相反的方法将不起作用。
然后,我还需要一个标志来判断它是左表还是右表,因为两个NSScrollView都将同时填充两个出口。这是我的界面文件中的标志:
@property (assign) Boolean isLeftTable;
我按照苹果的建议在同步设置了NSScrollViews之后立即设置了标志:
// This is Apple taken code:
self.leftScrollView.setSynchronized(self.rightScrollView)
self.rightScrollView.setSynchronized(self.leftScrollView)
// Here I set the flag to the two NSScrollViews:
self.leftScrollView.isLeftTable = true
self.rightScrollView.isLeftTable = false
准备已完成。现在,在该示例的syncedViewContentBoundsDidChange方法中,之后:
[[self contentView] scrollToPoint:newOffset];
我已插入此:
if (!self.isLeftTable) {
NSRect currentRightHeaderRect = self.rightOutLineHeaderView.frame;
currentRightHeaderRect.origin.x = -changedBoundsOrigin.x;
self.rightOutLineHeaderView.frame = currentRightHeaderRect;
} else {
NSRect currentLeftHeaderRect = self.leftOutLineHeaderView.frame;
currentLeftHeaderRect.origin.x = -changedBoundsOrigin.x;
self.leftOutLineHeaderView.frame = currentLeftHeaderRect;
}
目前可以使用,尽管需要进行一些测试并可能需要改进。非常感谢。