UIScrollView旋转时函数调用次序

近期项目中需实现分页的ScrollView旋转功能,但是遇到一个相当奇怪的问题:当scrollView处于最后一页时,旋转后的contentOffset值会异常,即旋转后scrollView可能不在最后一页。通过查找StackOverFlow和试验,最终发现:当scrollView处于最后一页时,旋转时调用的函数是不同的。

正常情况下(非最后一页),函数调用顺序如下:

  1. willRotateToInterfaceOrientation:duration:
  2. willAnimateRotationToInterfaceOrientation: duration:
  3. didRotateFromInterfaceOrientation:

最后一页时,函数调用顺序如下:

  1. willRotateToInterfaceOrientation: duration:
  2. scrollViewDidScroll:
  3. willAnimateRotationToInterfaceOrientation: duration:
  4. didRotateFromInterfaceOrientation:

UIScrollView在旋转时,会通过UIViewAutosizingMask的规范自动调整bounds的大小,这个bounds的变化在willAnimateRotationToInterfaceOrientation: duration:可以捕捉到,但是当UIScrollView处于最后一页时,系统在我们捕捉到scrollView尺寸变化之前调用了scrollViewDidScroll函数,恰巧我们经常性的在此函数中做翻页处理,从而导致了页面显示的不准确。

解决办法:在willRotateToInterfaceOrientation: duration:中强制将UIScrollView的scrollEnabled属性置为NO,然后在didRotateFromInterfaceOrientation:再次将scrollEnabled属性置为YES。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容