在iOS中大量使用UITableView
控件,用于列表展示,同時(shí)需要根據(jù)列表滾動(dòng)的偏移量做一些動(dòng)畫,比如頭部放大縮小,下拉刷新等效果,這些都可以通過UIScrollerView
的delegate
實(shí)時(shí)監(jiān)聽到滾動(dòng)的偏移量,并做相應(yīng)的處理! 而在Mac OSX 平臺(tái)
這一切都得你自己來寫,你可以進(jìn)入NSScrollerView
的頭文件查看,它并沒有delegate
屬性,所有我們需要自己是實(shí)現(xiàn)
NSScrollerView 結(jié)構(gòu)圖
//
// BaseScrollView.swift
// WeiboOS
//
// Created by yuanmaochao on 16/8/29.
// Copyright ? 2016年 king. All rights reserved.
//
?
import Cocoa
?
/// 通過協(xié)議 將 contentOffset 傳遞出去
/// 協(xié)議遵守 NSObjectProtocol 協(xié)議 就可以調(diào)用 respondsToSelector 方法判斷代理是否實(shí)現(xiàn)了代理方法 并且 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() {
/// 需要設(shè)置 self.contentView 可以發(fā)送 Bounds 改變通知
self.contentView.postsBoundsChangedNotifications = true
/// 監(jiān)聽通知
/// 需要注意 object: 必須要傳 self.contentView 如果傳nil
/// 其他 NSScrollerView 控件拖動(dòng)也會(huì)監(jiān)聽到
notificationCenter.addObserver(self,
selector: #selector(BaseScrollView.synchronizedViewContentBoundsDidChange(_:)),
name: NSViewBoundsDidChangeNotification,
object: self.contentView)
}
func synchronizedViewContentBoundsDidChange(note: NSNotification) {
/// self.contentView 是一個(gè) NSClipView 控件
/// self.contentView.documentVisibleRect 可見范圍 相當(dāng)于 UIScrollerView 的 contentSize
/// 判斷delegate 是否有值 并判斷是否實(shí)現(xiàn)了相關(guān)代理方法
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 {
/// 銷毀時(shí) 移除通知
stopSynchronizing()
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者