关注码农话题
做一个实实在在的内行人

解决点击状态栏时ScrollView自动滚动到初始位置失效办法:总结优化篇

前言:

项目中用到如题功能,就是当用户滑动到多页列表时,可直接点击系统状态栏自动滚回到第一行,即初始化位置,本是系统自带方法,但是理论和实践总是不那么完美的配合,故此做个总结;

问题:

情况一:本页面控制器只有一个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,

  1. – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. //延后处理,如果你崩溃,可以不需要延后
  4.     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(55 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  5.         [WNXTopWindow show];
  6.     });

2,

  1. + (void)initialize {
  2.     window_ = [[UIWindow alloc] init];
  3.     window_.frame = CGRectMake(00, [UIScreen mainScreen].bounds.size.width20);
  4. //添加一句代码,这里设置成透明色即可
  5.     window_.backgroundColor = [UIColor clearColor];
  6.     window_.windowLevel = UIWindowLevelAlert;
  7.     [window_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(windowClick)]];
  8. }

3,

  1. + (void)searchScrollViewInView:(UIView *)superview {
  2.     for (UIScrollView *subview in superview.subviews) {
  3. // 直接用self 调用当前类方法,可解决编译问题
  4.         // 如果是scrollview, 滚动最顶部
  5.         if ([subview isKindOfClass:[UIScrollView class]] && [self isShowingOnKeyWindow:subview]) {
  6.             CGPoint offset = subview.contentOffset;
  7.             offset.y = – subview.contentInset.top;
  8.             [subview setContentOffset:offset animated:YES];
  9.         }
  10.         // 递归继续查找子控件
  11.         [self searchScrollViewInView:subview];
  12.     }
  13. }

至此,解决了该需求,涉及原理和代码,请参考如上博客,也感谢两位作者分享。

另外推荐优质APP:IT面试宝典

iOS(http://dwz.cn/1EOMlZ
Android(http://dwz.cn/1Z9xjW


入职你的梦想 VS 变现你的技术

IT面试宝典码农市场