美文网首页
Mac OSX NSScrollerView 监听滚动偏移量

Mac OSX NSScrollerView 监听滚动偏移量

作者: 若非长得丑怎会做逗比 | 来源:发表于2016-08-29 13:49 被阅读917次
    在iOS中大量使用UITableView控件,用于列表展示,同时需要根据列表滚动的偏移量做一些动画,比如头部放大缩小,下拉刷新等效果,这些都可以通过UIScrollerViewdelegate实时监听到滚动的偏移量,并做相应的处理! 而在Mac OSX 平台这一切都得你自己来写,你可以进入NSScrollerView的头文件查看,它并没有delegate属性,所有我们需要自己是实现
    NSScrollerView 结构图
    //
    // BaseScrollView.swift
    // WeiboOS
    //
    // Created by yuanmaochao on 16/8/29.
    // Copyright © 2016年 king. All rights reserved.
    //
    ​
    import Cocoa
    ​
    /// 通过协议 将 contentOffset 传递出去
    /// 协议遵守 NSObjectProtocol 协议 就可以调用 respondsToSelector 方法判断代理是否实现了代理方法 并且 delegate 属性 才能使用 weak 修饰
    @objc protocol BaseScrollViewDelegate: NSObjectProtocol {
       
       optional func scrollViewDidContentOffsetChange(scrollView: BaseScrollView, contentOffset: NSPoint)
    }
    ​
    class BaseScrollView: NSScrollView {
       
       weak var delegate: BaseScrollViewDelegate?
       
       /// 重载初始化方法
       override init(frame frameRect: NSRect) {
           super.init(frame: frameRect)
           setup()
       }
       
       required init?(coder: NSCoder) {
           super.init(coder: coder)
           setup()
       }
       
       func setup() {
           /// 需要设置 self.contentView 可以发送 Bounds 改变通知
           self.contentView.postsBoundsChangedNotifications = true
           /// 监听通知
           /// 需要注意 object: 必须要传 self.contentView 如果传nil 
           /// 其他 NSScrollerView 控件拖动也会监听到
           notificationCenter.addObserver(self,
                                           selector: #selector(BaseScrollView.synchronizedViewContentBoundsDidChange(_:)),
                                           name: NSViewBoundsDidChangeNotification,
                                           object: self.contentView)
       }
       
       func synchronizedViewContentBoundsDidChange(note: NSNotification) {
           
           /// self.contentView 是一个 NSClipView 控件
           /// self.contentView.documentVisibleRect 可见范围 相当于 UIScrollerView 的 contentSize
           
           /// 判断delegate 是否有值 并判断是否实现了相关代理方法
           if let delegate = delegate {
               if delegate.respondsToSelector(#selector(BaseScrollViewDelegate.scrollViewDidContentOffsetChange(_:contentOffset:))) {
                   delegate.scrollViewDidContentOffsetChange!(self, newOffset: self.contentView.documentVisibleRect.origin)
               }
           }
           
           if NSEqualPoints(self.contentView.bounds.origin, self.contentView.documentVisibleRect.origin) == false {
               self.contentView.scrollToPoint(self.contentView.documentVisibleRect.origin)
               self.reflectScrolledClipView(self.contentView)
           }
           self.enclosingScrollView
       }
    ​
       func stopSynchronizing() {
           
           notificationCenter.removeObserver(self,
                                             name: NSViewBoundsDidChangeNotification,
                                             object: self.contentView)
           
       }
       
       deinit {
        /// 销毁时 移除通知
           stopSynchronizing()
       }
    }
    

    相关文章

      网友评论

          本文标题:Mac OSX NSScrollerView 监听滚动偏移量

          本文链接:https://www.haomeiwen.com/subject/jwbxettx.html