我有两个NSScrollViews配置为同步滚动。我的问题是附表标题没有水平滚动。有任何线索吗?

问题描述 投票:0回答:1

我正在为macOS开发可可应用程序。我需要两个NSOutlineView进行滚动同步。我遵循了众所周知的Apple example,并且效果很好。我想向代码中添加水平滚动,因此我将这一行代码添加到了NSScrollView子类中:

newOffset.x = changedBoundsOrigin.x;

之后:

newOffset.y = changedBoundsOrigin.y;

它工作得很好,假设目前,我假设两个列的NSOutlineView宽度在两个NSOutlineViews之间是相等的。问题是,当水平滚动时,另一个NSOutlineView的NSOutlineView标头不同步,因此它们不会跟随。有什么想法吗?

objective-c cocoa nstableview nsscrollview
1个回答
0
投票

我已经找到了一个可行的解决方案,目前对我来说是有益的,直到我实现了使列宽也保持同步的代码。我找到的解决方案如下:

在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;

 }

目前可以使用,尽管需要进行一些测试并可能需要改进。非常感谢。

© www.soinside.com 2019 - 2024. All rights reserved.