最近把老板辭了轴术,得空寫(xiě)寫(xiě)隨筆;開(kāi)發(fā)中遇到的問(wèn)題實(shí)在太多巫玻,記不住丛忆。這不最近用到了scrollViewDelegate祠汇,結(jié)果以前用到過(guò)但不常用的方法又忘了。寫(xiě)寫(xiě)加深印象熄诡,歡迎大家指正可很。
- 此文并不是要詳細(xì)解釋代理方法
- 總結(jié)一些平時(shí)不常用的(至少我不常用。凰浮。)
- 所有scrollViewDelegate方法執(zhí)行時(shí)scrollView屬性值都是默認(rèn)的我抠;
scrollViewDelegate方法主要分3類,滾動(dòng)類袜茧,zoom(縮放)類菜拓,還有個(gè)回到頂部;
一惫周、scrollViewDelegate調(diào)用順序
首先從scrollViewDelegate方法調(diào)用順序入手尘惧;
1.初始化完畢
- 初始化完畢只會(huì)調(diào)用下邊這一個(gè)方法康栈,并且滾動(dòng)和縮放時(shí)都會(huì)頻繁調(diào)用递递,這里要注意避免此方法返回的View或者其子類重復(fù)創(chuàng)建
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{}
2.滾動(dòng)時(shí)
- 各方法執(zhí)行順序如下
///將要開(kāi)始拖動(dòng)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{}
///實(shí)時(shí)滾動(dòng)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{}
///返回需要縮放的View
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{}
///將要結(jié)束拖動(dòng)
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {}
///已經(jīng)結(jié)束拖動(dòng)
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{}
///將要開(kāi)始減速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{}
///減速完畢 降為0
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}
- 逐個(gè)方法依次說(shuō)明
不實(shí)現(xiàn)縮放功能時(shí)一般不寫(xiě)
viewForZoomingInScrollView
方法,而且此方法在滾動(dòng)時(shí)幾乎與scrollViewDidScroll
同時(shí)穿插著調(diào)用啥么,在此說(shuō)明中就忽略了登舞;
①scrollViewWillBeginDragging
方法,在手指將要實(shí)現(xiàn)拖拽時(shí)觸發(fā)悬荣,只執(zhí)行一次菠秒;
②scrollViewDidScroll
方法,只要界面在滾動(dòng)氯迂,不管是手指拖動(dòng)践叠,減速滑動(dòng),還是縮放都會(huì)觸發(fā)嚼蚀。多次執(zhí)行禁灼;
③在多次執(zhí)行scrollViewDidScroll
后就會(huì)依次連續(xù)執(zhí)行后面scrollViewWillEndDragging
scrollViewDidEndDragging
scrollViewWillBeginDecelerating
三個(gè)方法,并且只執(zhí)行一次;
④在滑動(dòng)速度減為0前扔會(huì)多次執(zhí)行scrollViewDidScroll
方法轿曙,最后執(zhí)行scrollViewDidEndDecelerating
方法弄捕,滾動(dòng)結(jié)束;
3.zoom(縮放)時(shí)
- 各方法執(zhí)行順序如下
///返回需要縮放的View
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{}
///將要開(kāi)始縮放
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view {}
///實(shí)時(shí)滾動(dòng)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{}
///實(shí)時(shí)縮放
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{}
///縮放結(jié)束
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale{}
- 逐個(gè)方法依次說(shuō)明
有趣的是
viewForZoomingInScrollView
方法导帝,在縮放時(shí)并不執(zhí)行 守谓,只在縮放開(kāi)始與結(jié)束前執(zhí)行了幾次而已;
縮放時(shí)頻繁調(diào)用的方法是scrollViewDidZoom
scrollViewDidScroll
這兩個(gè)您单,由此可見(jiàn)只要scrollView發(fā)生矢量變化scrollViewDidScroll
方法都會(huì)執(zhí)行斋荞;
進(jìn)行縮放時(shí),需要設(shè)置scrollView的
maximumZoomScale
與minimumZoomScale
兩個(gè)最大伸縮比例與最小伸縮比例,如果不設(shè)置默認(rèn)值為1.0原始大小虐秦,捏合時(shí)平酿,代理方法不觸發(fā)讯檐;
進(jìn)行縮放時(shí),
contentSize
會(huì)發(fā)生變化;
①viewForZoomingInScrollView
方法返回要縮放的View染服,多次執(zhí)行别洪,具體觸發(fā)誘因還不清楚,歡迎補(bǔ)充柳刮;
②scrollViewWillBeginZooming
方法挖垛,在手指將要捏合時(shí)觸發(fā),只執(zhí)行一次秉颗;
③縮放時(shí)痢毒,在多次執(zhí)行scrollViewDidScroll
scrollViewDidZoom
兩個(gè)方法;
④在手指離開(kāi)屏幕后蚕甥,執(zhí)行scrollViewDidEndZooming
方法一次哪替,縮放結(jié)束;
3.觸發(fā)返回頂部時(shí)
- 各方法執(zhí)行順序如下
///確定回到頂部菇怀?
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{}
///實(shí)時(shí)滾動(dòng)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{}
///已經(jīng)回到頂部
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{}
- 逐個(gè)方法依次說(shuō)明
①用戶點(diǎn)擊狀態(tài)欄時(shí)觸發(fā)scrollViewShouldScrollToTop
方法凭舶,需要返回BOOL
。若返回NO
爱沟,則響應(yīng)失效帅霜,不回到頂部;
②在回到頂部滾動(dòng)過(guò)程中觸發(fā)scrollViewDidScroll
方法呼伸,執(zhí)行多次身冀;
③回到頂部后觸發(fā)scrollViewDidScrollToTop
;
4.小結(jié)
- 只要scrollView發(fā)生矢量變化
scrollViewDidScroll
方法都會(huì)執(zhí)行括享,所以此方法使用時(shí)要注意搂根; - zoom相關(guān)代理方法最好單獨(dú)使用;
二铃辖、手指滾動(dòng)與代碼滾動(dòng)scrollView
手指滾動(dòng)其實(shí)上一節(jié)已經(jīng)說(shuō)的差不多了剩愧;代碼滾動(dòng)多是通過(guò)改變contentOffset
的值來(lái)進(jìn)行;
1. 通過(guò)手指滾動(dòng)
- 通過(guò)手指在屏幕上拖拽而產(chǎn)生滾動(dòng)澳叉,所觸發(fā)的方法如 第一節(jié)中的 2.隙咸;
2.通過(guò)contentOffset滾動(dòng)
- 滾動(dòng)過(guò)程中觸發(fā)
scrollViewDidScroll
,執(zhí)行一次成洗;
3.通過(guò)setContentOffset:animated:YES 滾動(dòng)
- 滾動(dòng)過(guò)程中仍然是多次觸發(fā)
scrollViewDidScroll
;滾動(dòng)結(jié)束后會(huì)觸發(fā)scrollViewDidEndScrollingAnimation
五督,執(zhí)行一次;
3.通過(guò)scrollView的子類的屬性滾動(dòng)
- 例如tableView的
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
和 collectionView 的
- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated;
等等瓶殃,諸如此類的方法都和- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
觸發(fā)效果相同充包;
三、手指縮放與代碼縮放scrollView
手指縮放仍然與第一節(jié)說(shuō)的差不多;代碼縮放多是通過(guò)改變zoomScale
的值來(lái)進(jìn)行基矮;
1. 通過(guò)手指縮放
- 通過(guò)手指在屏幕上捏合而產(chǎn)生滾動(dòng)淆储,所觸發(fā)的方法如 第一節(jié)中的 3.;
2.通過(guò)zoomScale縮放
- 縮放一次觸發(fā)
scrollViewDidZoom
執(zhí)行一次家浇;
3.通過(guò)setZoomScale:animated:YES 滾動(dòng)
- 縮放過(guò)程中與手勢(shì)縮放執(zhí)行發(fā)方法順序相同本砰;
寫(xiě)在最后
對(duì)于這次想要小記一下钢悲,是因?yàn)樽錾舷聅crollView聯(lián)動(dòng)這個(gè)頁(yè)面時(shí)想要優(yōu)化点额,所以就挨個(gè)了解每個(gè)代理方法的用處;并且我還嘗試了上collectionView下scrollView+tableViewController 莺琳、上collectionView下collectionView+tableViewController兩種不同的構(gòu)建方法还棱;至于這兩種的優(yōu)缺嘛,個(gè)人總結(jié)了一下兩點(diǎn)惭等,有興趣的同學(xué)歡迎補(bǔ)充:
- 若tableViewController內(nèi)容布局大不相同 用前者的組合珍手;但tableViewController的增多會(huì)使內(nèi)存增加些許;
- 若tableViewController內(nèi)容布局相似辞做,用后者的組合可以減少內(nèi)存的分配琳要,因?yàn)閏ollectionView會(huì)把tableViewController.view循環(huán)重用;但同時(shí)也會(huì)增加些許CPU計(jì)算量凭豪;
告一段落焙蹭,歡迎指正晒杈,第一次寫(xiě)嫂伞,不好的地方請(qǐng)大家見(jiàn)諒~