近期项目中需实现分页的ScrollView旋转功能,但是遇到一个相当奇怪的问题:当scrollView处于最后一页时,旋转后的contentOffset值会异常,即旋转后scrollView可能不在最后一页。通过查找StackOverFlow和试验,最终发现:当scrollView处于最后一页时,旋转时调用的函数是不同的。
正常情况下(非最后一页),函数调用顺序如下:
- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation: duration:
- didRotateFromInterfaceOrientation:
最后一页时,函数调用顺序如下:
- willRotateToInterfaceOrientation: duration:
- scrollViewDidScroll:
- willAnimateRotationToInterfaceOrientation: duration:
- didRotateFromInterfaceOrientation:
UIScrollView在旋转时,会通过UIViewAutosizingMask的规范自动调整bounds的大小,这个bounds的变化在willAnimateRotationToInterfaceOrientation: duration:可以捕捉到,但是当UIScrollView处于最后一页时,系统在我们捕捉到scrollView尺寸变化之前调用了scrollViewDidScroll函数,恰巧我们经常性的在此函数中做翻页处理,从而导致了页面显示的不准确。
解决办法:在willRotateToInterfaceOrientation: duration:中强制将UIScrollView的scrollEnabled属性置为NO,然后在didRotateFromInterfaceOrientation:再次将scrollEnabled属性置为YES。
网友评论