web-dev-qa-db-ja.com

NSScrollViewがスクロールされたときのコールバック?

ユーザーがNSScrollViewをスクロールしていることを知る必要があるMacアプリを作成していますが、次のデリゲートメソッドを持つUIScrollViewのようなメソッドが見つかりません。

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

App Kitに同様のデリゲートメソッドを使用できますか?前もって感謝します。

カイ。

39
nonamelive

スクロールビューのコンテンツビューの境界を監視することにより、スクロールビューの変更を監視できます。まず、変更を投稿するようにコンテンツビューを設定します。

[contentView setPostsBoundsChangedNotifications:YES];

次に、これらの通知のオブザーバーとして登録します。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boundsDidChange:) name:NSViewBoundsDidChangeNotification object:contentView]; 
69
Sean Rich

最近同じ問題が発生しました...減速コールバックをいくらかエミュレートするために、オーバーライドすることが可能です

-(void) scrollWheel:(NSEvent *)theEvent 

nSScrollViewクラスのですが、イベントフェーズのイベントフェーズの代わりにtheEvent.momentumPhaseを確認してください。

4
Alexei Zaitsev

@Seanリッチの答えに追加します。

contentViewは、NSClipViewNSScrollViewの間のNSCollectionViewです。

Picture of clip view from the Storyboard

これを機能させるには、ClipViewpostsBoundsChangedNotificationsに設定する必要があり、を通知オブジェクトに渡す必要があります。

self.clipView.postsBoundsChangedNotifications = true

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

Swift 4:の更新

scrollView.contentView.postsBoundsChangedNotifications

また、呼び出しは次のとおりです。

NotificationCenter.default.addObserver(self,
                                       selector: #selector(boundsChange),
                                       name: NSView.boundsDidChangeNotification,
                                       object: scrollView.contentView)

編集:Macのコレクションはscrollviewから継承しません。適切に更新されました

3
wolffan

Swift 4.2 OSXの私の2セント:

..。

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){

    }
0
ingconti