Обратные вызовы, когда NSScrollView прокручивается? - PullRequest
38 голосов
/ 02 марта 2011

Я делаю приложение для Mac, которое должно знать, когда пользователь прокручивает NSScrollView, однако я не могу найти какие-либо методы, такие как UIScrollView, у которых есть следующие методы делегата:

– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:

Могу ли я иметь аналогичные методы делегата для набора приложений? Заранее спасибо.

Кай.

Ответы [ 5 ]

67 голосов
/ 02 марта 2011

Вы можете отслеживать изменения в представлении прокрутки, отслеживая границы его представления содержимого. Сначала установите представление содержимого, чтобы опубликовать его изменения с помощью

[contentView setPostsBoundsChangedNotifications:YES];

Затем зарегистрируйтесь в качестве наблюдателя этих уведомлений с помощью

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boundsDidChange:) name:NSViewBoundsDidChangeNotification object:contentView]; 
3 голосов
/ 23 марта 2018

Обновление для swift 4:

scrollView.contentView.postsBoundsChangedNotifications

Также вызов: NotificationCenter.default.addObserver (self, селектор: #selector (boundsChange), имя: NSView.boundsDidChangeNotification,object: self)

Редактировать: коллекция в Mac не наследуется от scrollview.обновлено должным образом

3 голосов
/ 12 декабря 2012

Недавно возникла такая же проблема ... Чтобы несколько эмулировать обратные вызовы замедления, можно переопределить

-(void) scrollWheel:(NSEvent *)theEvent 

класса NSScrollView, но затем вместо * Событие установите theEvent.momentumPhase фаза для этапов событий.

2 голосов
/ 06 мая 2018

Добавление к ответу @Sean Rich.

contentView - это NSClipView между NSScrollView и NSCollectionView.

Picture of clip view from the Storyboard

Чтобы это работало, оба ClipView должны быть установлены в postsBoundsChangedNotifications и должны быть переданы в объекте уведомления.

self.clipView.postsBoundsChangedNotifications = true

NotificationCenter.default.addObserver(self,
                                       selector: #selector(collectionViewDidScroll(notification:)),
                                       name: NSView.boundsDidChangeNotification,
                                       object: self.clipView)
0 голосов
/ 26 марта 2019

два моих цента за swift 4.2 OSX:

....

if let clipView = self.collectionView.superview, let sv = clipView.superview as? NSScrollView{

        let contentView = sv.contentView
        contentView.postsBoundsChangedNotifications = true

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(collectionViewDidScroll(notification:)),
                                               name: NSView.boundsDidChangeNotification,
                                               object: clipView)
}








 //MARK: scrollview observer:

    @objc func collectionViewDidScroll(notification: Notification){

    }
...