近期項(xiàng)目中需實(shí)現(xiàn)分頁(yè)的ScrollView旋轉(zhuǎn)功能,但是遇到一個(gè)相當(dāng)奇怪的問(wèn)題:當(dāng)scrollView處于最后一頁(yè)時(shí),旋轉(zhuǎn)后的contentOffset值會(huì)異常,即旋轉(zhuǎn)后scrollView可能不在最后一頁(yè)。通過(guò)查找StackOverFlow和試驗(yàn),最終發(fā)現(xiàn):當(dāng)scrollView處于最后一頁(yè)時(shí),旋轉(zhuǎn)時(shí)調(diào)用的函數(shù)是不同的。
正常情況下(非最后一頁(yè)),函數(shù)調(diào)用順序如下:
- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation: duration:
- didRotateFromInterfaceOrientation:
最后一頁(yè)時(shí),函數(shù)調(diào)用順序如下:
- willRotateToInterfaceOrientation: duration:
- scrollViewDidScroll:
- willAnimateRotationToInterfaceOrientation: duration:
- didRotateFromInterfaceOrientation:
UIScrollView在旋轉(zhuǎn)時(shí),會(huì)通過(guò)UIViewAutosizingMask的規(guī)范自動(dòng)調(diào)整bounds的大小,這個(gè)bounds的變化在willAnimateRotationToInterfaceOrientation: duration:可以捕捉到,但是當(dāng)UIScrollView處于最后一頁(yè)時(shí),系統(tǒng)在我們捕捉到scrollView尺寸變化之前調(diào)用了scrollViewDidScroll函數(shù),恰巧我們經(jīng)常性的在此函數(shù)中做翻頁(yè)處理,從而導(dǎo)致了頁(yè)面顯示的不準(zhǔn)確。
解決辦法:在willRotateToInterfaceOrientation: duration:中強(qiáng)制將UIScrollView的scrollEnabled屬性置為NO,然后在didRotateFromInterfaceOrientation:再次將scrollEnabled屬性置為YES。