只有一个ScrollView的时候
我们在使用App的时候,经常会看到这样的效果,当我们点击状态栏的时候,我们已经滚动过的内容,会自动的滚回顶部,例如:设置界面:
其实这个功能是系统默认实现的,不需要自己写代码。
当点击状态栏的时候自动滚回顶部是因为UIScrollView的scrollsToTop的属性为YSE
@property(nonatomic) BOOL scrollsToTop __TVOS_PROHIBITED; // default is YES.
居然系统已经实现了这个功能,那么为什么还要自己实现呢?
这个是因为,系统实现的是有缺陷的。
当ScrollView超过一个的时候
下面是苹果对scrollsToTop属性的解析说明
// When the user taps the status bar, the scroll view beneath the touch which is closest to the status bar will be scrolled to top, but only if its `scrollsToTop` property is YES, its delegate does not return NO from `shouldScrollViewScrollToTop`, and it is not already at the top.
// On iPhone, we execute this gesture only if there's one on-screen scroll view with `scrollsToTop` == YES. If more than one is found, none will be scrolled.
那就是当前视图下,超过一个ScrollView的时候,即使你将scrollsToTop的值设置为YES,但是在点击状态栏的时候,不会有一个ScrollView会滚动到顶部。
这个时候,如果我们需要这个功能,那么就要我们手动实现了。
针对这个,我封装了一个小框架“一行代码完成“点击状态栏滚动视图当前内容滚动到顶部”,框架集成了CocoaPods,方便使用,一行代码可以实现这个小功能。
使用LYTopWindow
第一步:使用CocoaPods导入LYTopWindow
在 Podfile
中进行如下导入:
pod 'LYTopWindow'
然后使用 cocoaPods
进行安装:
如果尚未安装 CocoaPods, 运行以下命令进行安装:
gem install cocoapods
安装成功后就可以安装依赖了:
建议使用如下方式:
# 禁止升级CocoaPods的spec仓库,否则会卡在 Analyzing dependencies ,非常慢
pod update --verbose --no-repo-update
如果提示找不到库,则可去掉 --no-repo-update
pod update
第二步:集成点击状态栏当前内容滚动到顶部
导入头文件
#import <LYTopWindow.h>
在AppDelegate.m中方法application:didFinishLaunchingWithOptions:中添加以下代码
[[LYTopWindow sharedTopWindow] setClickStatusBarBlock:^{
// 让keyWindow上的ScrollView滚动到顶部
[[LYTopWindow sharedTopWindow] searchAllScrollViewsInView:[UIApplication sharedApplication].keyWindow];
// 如果需要实现点击状态栏,实现其他功能,可用在这里编写功能代码
}];
注意:如果需要实现其他功能效果,可以将这句代码替换成其他需要的代码
[LYTopWindow sharedTopWindow] searchAllScrollViewsInView:[UIApplication sharedApplication].keyWindow];
框架里面有个小Demo,可以自行实验,欢迎Issues
LYTopWindow地址:https://github.com/DeveloperLY/LYTopWindow
如果想了解LYTopWindow的实现原理,可以查看我的另一篇文章《点击状态栏,滚动视图返回顶部的实现》