Остановить NSScrollView только по определенным значениям. Подобно UIScrollView paging

Я работаю над Mac OS X, используя SDK 10.7 в качестве цели развертывания. NSScrollView содержит горизонтальный список миниатюр изображений. Миниатюра, которая находится в центре ScrollView, отображает выбранное изображение, которое отображается под ScrollView в полном размере. Это очень похоже на Coverer Flow Finder, кроме того, что изображения в моем приложении не текут, а просто прокручиваются.

Я хотел бы ограничить прокрутку, чтобы останавливаться только тогда, когда эскиз точно находится в центре. Метод NSView adjustScroll: не является решением. Это отключит "плавную" прокрутку и позволит ScrollView перейти от одного миниатюры к следующему.

Мне нужен какой-то action/callback, который говорит мне, что прокрутка прокрутки завершена. Я мог бы проверить, нормально ли позиция (если миниатюра находится в центре) или прокрутка назад/вперед до ближайшего эскиза. Но NSScrollView не обеспечивает такой обратный вызов.

Я попытался заметить изменения в кадре ControllView ScrollViews. Evertime изменения кадра Я запускаю таймер. Если таймер не перезапускается до того, как он срабатывает, я предполагаю, что прокрутка остановлена. Это не очень хорошо. Если прокрутка останавливается только на короткое время (например, потому что палец перемещается, чтобы сделать другой жест жестов), следующая прокрутка мешает коррекции положения.

Использование UIScrollView под iOS решает эту задачу без каких-либо проблем. Аналогичная функция подкачки для 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, указанной в исходном вопросе.