谈谈tableview一键到顶和UIScrollView的scrollsToTop属性

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


谈谈tableview一键到顶和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 hasscrollsToTop
set toNO
, its delegate returnsNO
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

另外,在tableview的其他地方,可以用改变位置的方式使它滚动到顶部

1.[mainFolioTB setContentOffset:CGPointMake(0,0) animated:NO];

2. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:lineNumber inSection:0];
[tableView_ selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle];

你可能感兴趣的:(谈谈tableview一键到顶和UIScrollView的scrollsToTop属性)