仅在特定值上停止 NSScrollView - 像 UIScrollView 分页

Posted

技术标签:

【中文标题】仅在特定值上停止 NSScrollView - 像 UIScrollView 分页【英文标题】:Stop NSScrollView only on specific values - Like UIScrollView paging 【发布时间】:2021-11-22 15:12:43 【问题描述】:

我正在开发一个使用 SDK 10.7 作为部署目标的 Mac OS X 应用程序。 NSScrollView 包含图像缩略图的水平列表。 ScrollView 中心的缩略图表示所选图像,该图像以全尺寸显示在 ScrollView 下方。这与 Finder Cover-Flow 非常相似,除了我的应用程序中的图像不会流动而只是滚动。

我想限制滚动只在缩略图正好位于中心时停止。 NSView 方法 adjustScroll: 是无解的。这将禁用“平滑”滚动并让 ScrollView 从一个缩略图跳转到下一个。

我需要某种 action/callback 来告诉我 ScrollView 已完成滚动。我可以检查位置是否正常(如果缩略图在中心)或向后/向前滚动到最近的缩略图。但是 NSScrollView 没有提供这样的回调。

我试图观察 ScrollViews contenView 的框架变化。每当框架发生变化时,我都会启动一个计时器。如果计时器在触发之前没有重新启动,我假设滚动停止。这不是很好。如果滚动仅在短时间内停止(例如,因为手指移动以执行另一个滑动手势),则下一次滚动会干扰位置的校正。

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

有人知道怎么解决吗?

非常感谢!

【问题讨论】:

【参考方案1】:

你可以使用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)];
 ];

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


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

【讨论】:

以上是关于仅在特定值上停止 NSScrollView - 像 UIScrollView 分页的主要内容,如果未能解决你的问题,请参考以下文章

amCharts 4:仅在截断的(带省略号)值上显示图例工具提示

已发布值上的 SwiftUI toggle() 函数停止使用 Swift 5.2 触发 didSet

如何在angular-ui-grid中的特定值上为行着色?

如何基于查找数据框创建数据框并在特定列中的动态和映射值上创建多列

仅在特定时间每分钟运行一次 cron 作业?

javascript Lodash / Underscore排序对象键。像_.sortBy(),但在键而不是值上,返回一个对象,而不是一个数组。默认为alphan