仅在特定值上停止NSScrollView - 与UIScrollView分页一样

And*_*ord 15 macos nsscrollview scroll-paging

我正在使用SDK 10.7作为部署目标的Mac OS X应用程序.NSScrollView包含图像缩略图的水平列表.位于ScrollView中心的缩略图表示所选图像,该图像以完整大小显示在ScrollView下方.这与Finder Cover-Flow非常相似,除了我的应用程序中的图像不会流动但只是向外滚动.

我想限制滚动仅在缩略图正好位于中心时停止.NSView方法adjustScroll:没有解决方案.这将禁用"平滑"滚动并让ScrollView从一个缩略图跳转到下一个缩略图.

我需要某种动作/回调告诉我ScrollView完成了滚动.我可以检查位置是否正常(如果缩略图在中间)或向后/向前滚动到最近的缩略图.但NSScrollView不提供这样的回调.

我试着观察ScrollViews contenView框架的变化.交替帧改变我启动计时器.如果计时器在启动之前没有重新启动,我认为滚动停止了.这不是很好.如果滚动仅在短时间内停止(例如,因为手指被移动以进行另一次轻扫手势),则下一次滚动会干扰位置的校正.

在iOS下使用UIScrollView可以毫无问题地解决此任务.NSScrollView的类似分页功能将是一个完美的解决方案.

有谁知道如何解决这个问题?

非常感谢你!

s4y*_*s4y 2

您可以使用NSScrollViewDidEndLiveScrollNotification

NSScrollView* scrollView;
const CGFloat interval = 100;
[[NSNotificationCenter defaultCenter]
 addObserverForName:NSScrollViewDidEndLiveScrollNotification
 object:scrollView
 queue:nil
 usingBlock:^(NSNotification* notification) {
     CGFloat offset = scrollView.contentView.bounds.origin.y;
     offset = round(offset / interval) * interval;
     [scrollView.contentView.animator setBoundsOrigin:NSMakePoint(0, offset)];
 }];
Run Code Online (Sandbox Code Playgroud)

您可以用来NSAnimationContext调整动画的持续时间和时间。


注意:根据文档,此通知是在 10.9 中引入的,因此它不会成为原始问题中提到的 10.7 部署目标的选项。