谈一谈UIScrollView的scrollsToTop属性

相信很多人都没有注意到iOS有这样一个隐藏的功能:当前页面有滚动视图( UIScrollView 或者 UIScrollView 的子类,下面我都称作滚动视图),触摸状态栏,视图会自动滚动的最顶端,相当于一些网页的回到顶端的功能。下面给个图来展示下:

谈一谈UIScrollView的scrollsToTop属性_第1张图片
图1:触摸状态栏回到顶部

一. 遇到的问题

如果页面有多个滚动视图,如顶部一个广告轮播控件(假如是基于 UIScrollView 的轮播控件),下面是一个TableView,你会发现触摸状态栏没有反应了,回到顶部功能失效。

二. 解决问题

细细研究了一番返现,UIScrollView 有个scrollsToTop属性,这个属性就是控制滚动到顶部手势的开关。它的默认值是 YES ,所以不用我们设置,默认是支持滚动到顶部的。具体详细描述如下:

The scroll-to-top gesture is a tap on the status bar. When a user makes this gesture, the system asks the scroll view closest to the status bar to scroll to the top. If that scroll view has scrollsToTop
set to NO , its delegate returns NO from scrollViewShouldScrollToTop:
, or the content is already at the top, nothing happens.

简单点的说就是有两种方式来设定 scroll to top,一个是设置 scrollsToTop 属性,另一个是实现UIScrollView的代理方法scrollViewShouldScrollToTop:。如果滚动视图scrollsToTop属性设为 NO ,它的代理方法scrollViewShouldScrollToTop:返回NO,或者内容已经在顶部了,这样触摸状态栏,是没有任何反应的。

好了,继续回到上面遇到的问题,既然默认是YES,为什么回到顶部的功能失效了呢,其实仔细想一想就知道了,因为有两个 scrollView,他们默认都有 scroll to top 功能,所以触摸状态栏时,系统无法判断是使哪个ScrollView回到顶部。

解决方案很简单,就是设置其中一个ScrollView的 scrollsToTop 值为 NO(例如我将广告轮播控件的 scrollsToTop 设为 NO ),这样系统就知道要使哪个 ScrollView 回到顶部了。如果当前页面有多个滚动视图的话,要确保只有一个滚动视图scrollsToTop的值为YES

你可能感兴趣的:(谈一谈UIScrollView的scrollsToTop属性)