解决点击状态栏时ScrollView自动滚动到初始位置失效办法:总结优化篇
2016-03-14 12:52
531 查看
前言:
项目中用到如题功能,就是当用户滑动到多页列表时,可直接点击系统状态栏自动滚回到第一行,即初始化位置,本是系统自带方法,但是理论和实践总是不那么完美的配合,故此做个总结;
问题:
情况一:本页面控制器只有一个UIScrollView(UITableView、UICollectionView 、UITextView 、UIWebView 等一切继承自UIScrollView的控件);
这种情况可以直接利用官方建议直接解决即可,设置:crollview.scrollsToTop = YES(默认就是YES),如果该控件内部含有子控件,比如常见的UTTextView,可以设置子控件为NO就能解决,此种情况比较简单,详细可参看:http://xbiii3s.iteye.com/blog/1314517,笔者不再多说;
情况二:本页面控制器有多个UIScrollView(UITableView、UICollectionView 、UITextView 、UIWebView 等一切继承自UIScrollView的控件);
这种情况就发现自带方法以及失效,原理也很简单,就是系统发现有多个控件,不知道滚动那个到顶部,比如常见的网易新闻客户端左右滑动多个UITableView式,解决原理也还是可以理解的,就是能定位到当前是那个UIScrollView显示在keyWindow上,然后对它进行单独设置滚动方法,就是个循环遍历的过程,具体详情可以参看:http://www.cocoachina.com/ios/20150807/12949.html,笔者就不多说原理了,这里只是补充用该大牛方式遇到的问题:
1,设置后程序崩溃;
2,解决1后出现状态栏变黑;
3,编译提示找不到某个方法;
逐一解决,这里参考代码:
1,
2,
3,
至此,解决了该需求,涉及原理和代码,请参考如上博客,也感谢两位作者分享。
另外推荐优质APP:IT面试宝典
iOS(http://dwz.cn/1EOMlZ)
Android(http://dwz.cn/1Z9xjW)
项目中用到如题功能,就是当用户滑动到多页列表时,可直接点击系统状态栏自动滚回到第一行,即初始化位置,本是系统自带方法,但是理论和实践总是不那么完美的配合,故此做个总结;
问题:
情况一:本页面控制器只有一个UIScrollView(UITableView、UICollectionView 、UITextView 、UIWebView 等一切继承自UIScrollView的控件);
这种情况可以直接利用官方建议直接解决即可,设置:crollview.scrollsToTop = YES(默认就是YES),如果该控件内部含有子控件,比如常见的UTTextView,可以设置子控件为NO就能解决,此种情况比较简单,详细可参看:http://xbiii3s.iteye.com/blog/1314517,笔者不再多说;
情况二:本页面控制器有多个UIScrollView(UITableView、UICollectionView 、UITextView 、UIWebView 等一切继承自UIScrollView的控件);
这种情况就发现自带方法以及失效,原理也很简单,就是系统发现有多个控件,不知道滚动那个到顶部,比如常见的网易新闻客户端左右滑动多个UITableView式,解决原理也还是可以理解的,就是能定位到当前是那个UIScrollView显示在keyWindow上,然后对它进行单独设置滚动方法,就是个循环遍历的过程,具体详情可以参看:http://www.cocoachina.com/ios/20150807/12949.html,笔者就不多说原理了,这里只是补充用该大牛方式遇到的问题:
1,设置后程序崩溃;
2,解决1后出现状态栏变黑;
3,编译提示找不到某个方法;
逐一解决,这里参考代码:
1,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //延后处理,如果你崩溃,可以不需要延后 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [WNXTopWindow show]; });
}
2,
+ (void)initialize {
window_ = [[UIWindow alloc] init];
window_.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20);
//添加一句代码,这里设置成透明色即可
window_.backgroundColor = [UIColor clearColor];
window_.windowLevel = UIWindowLevelAlert;
[window_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(windowClick)]];
}
3,
+ (void)searchScrollViewInView:(UIView *)superview {
for (UIScrollView *subview in superview.subviews) {
// 直接用self 调用当前类方法,可解决编译问题
// 如果是scrollview, 滚动最顶部
if ([subview isKindOfClass:[UIScrollView class]] && [self isShowingOnKeyWindow:subview]) {
CGPoint offset = subview.contentOffset;
offset.y = - subview.contentInset.top;
[subview setContentOffset:offset animated:YES];
}// 递归继续查找子控件
[self searchScrollViewInView:subview];
}}
至此,解决了该需求,涉及原理和代码,请参考如上博客,也感谢两位作者分享。
另外推荐优质APP:IT面试宝典
iOS(http://dwz.cn/1EOMlZ)
Android(http://dwz.cn/1Z9xjW)
相关文章推荐
- 精确计时
- 一个简单的JSP+JavaBean web计算器
- IO 专题
- [leetcode] 296. Best Meeting Point 解题报告
- mysql
- CodeForces 618A Slime Combining
- C++中cos,sin,asin,acos这些三角函数操作的是弧度,而非角度,
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 (转
- 一般线性模型的最小二次方拟合方法
- 2.0新版本对数据结构进行了大幅修改:
- 化:尽量用memset将一个数组设置清零,而不是通过for循环逐个置0
- OpenCV学习笔记(2):Mat矩阵的初始化
- opencv子矩阵操作
- 顺序栈与链栈
- OpenCV基础-cvCloneImage、cvCopyImage和 cvCloneMat、cvCopyMat(2010-12-06 22:16:28)
- sss--OpenCV
- Eclipse 常用快捷键
- 百度地图Api 根据两个坐标点计算距离
- Spark:用Scala和Java实现WordCount
- Testin云測公布首份国内应用质量报告:半数APP平均启动时间不合格