美文网首页iOS进阶架构师之路iOS学习笔记
ios开发之-点击屏幕顶部StatusBar让UIScrollV

ios开发之-点击屏幕顶部StatusBar让UIScrollV

作者: coderboy001 | 来源:发表于2016-03-14 01:03 被阅读5616次
    • iOS APP中有一个非常好用的功能,那就是当我们在滚动一个UIScrollView滚动了很远很远的时候,假如我们想让UIScrollView回到顶部,我们绝大多数人的做法就是慢慢慢慢的滚动UIScrollView直到他回到顶部,但是iOS给我们提供了一个非常有用的功能,那就是只要我们一点击屏幕上的状态栏,就能让UIScrollView自动回到顶部(初始位置),其实我也是今天学到了这个知识点才知道了这个功能😅😂😂感谢MJ

    • 让UIScrollView自动回到顶部(初始位置)的原理:
      要使UIScrollView滚动到某一个位置,无非就是设置

    CGPoint offect = scrollView.contentOffset;
    offect.y = - scrollView.contentInset.top;
    [scrollView setContentOffset:offect animated:YES];
    

    当控制器上只有一个UIScrollView时,系统就会去遍历主窗口上所有的view,当遍历到那个UIScrollView时,就会为他设置:

    CGPoint offect = scrollView.contentOffset;
    offect.y = - scrollView.contentInset.top;
    [scrollView setContentOffset:offect animated:YES];
    

    当我们一点击statusBar时,就会执行上述代码让UIScrollView回滚到初始位置

    • 这个功能的不足之处:
      • 当控制器上面只有一个UIScrollView的时候,系统才会为这个UIScrollView添加这个自动回滚到顶部的功能
      • 当一个控制器上有多个UIScrollView时,系统就懵了,因为他不确定到底要为那个UIScrollView设置这个自动回滚到顶部的功能,这个时候就只能有我们coder明确的告诉系统:我们要为哪个UIScrollView设置自动回滚到顶部的功能
        • 解决办法:
          • 既然系统不能在有多个UIScrollView的时候设置上述功能,那哥就自己来设置,问题是在众多的UIScrollView中,我们应该为那个UIScrollView设置这种功能呢??
          • 答案是:我们只为显示在用户眼前的UIScrollView设置那个功能
          • 1.新建一个类LXBTopWindow,我们要在里面控制window的创建,显示和隐藏,我们并不会用到系统自带的一个UIWindow的方法或者属性,因此继承自NSObject就够了,为了调用方便,过设计为类方法
          • 2.由于在iOS9中,所有的window都必须要有一个rootViewController,因此我们新建一个类LXBTopViewController让他作为window的rootViewController
          • 3.遍历window上的所有UIScrollView,为满足实际要求的UIScrollView设置回滚到初始位置的功能
    Paste_Image.png Paste_Image.png Paste_Image.png
    • 大家都知道自iOS7之后,statusBar的样式是交给控制器来管理的,现在我们在statusBar上盖了一个window,系统就会认为statusBar既然已经看不见了,就没必要多此一举地在用控制器去控制statusBar的样式,因此控制器中控制statusBar样式的代码将会失效
      失效代码如下:
    • (UIStatusBarStyle)preferredStatusBarStyle
      {
      return UIStatusBarStyleLightContent;
      }
    - 解决办法:
      - 1.既然这个问题是window引起的,那么自然可以从window下手,window一显示出来,控制器中控制statusBar样式的代码就要失效,因此解决之道就是让window隐藏就可以了
      - 2.自iOS7之后,statusBar的样式是交给控制器来管理的,但是在iOS7以前statusBar的样式是由UIApplication来管理的,既然window一显示出来,控制器中控制statusBar样式的代码就要失效,那么我们可不可以重新把statusBar样式交给UIApplication来管理呢?? 你控制器失效就失效,哥把statusBar的样式重新交给UIApplication来管理
    
      - 答案是:YES,我们可以把statusBar的样式重新交给UIApplication来管理,只需要在Info.plist文件中添加如下字典:
        ![Paste_Image.png](https://img.haomeiwen.com/i1432650/70a76621f5a011b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    这样statusBar的样式就会被UIApplication来管理了,我们可以通过:
    ``` objc
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    

    去控制statusBar的样式,值得注意的是,由于此时我们对statusBar的操作是应用级别的,因此整个应用程序中的statusBar的样式都被修改为UIStatusBarStyleLightContent,但是有的地方是不能用UIStatusBarStyleLightContent的,因此我们要在合适的地方(比如这个控制器被弹出屏幕的时候),将statusBar的样式复原:

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
    

    相关文章

      网友评论

      • a24df6838a47:好像明白了 又好像没明白
      • 65d30ed3eda2:isShowInWindow方法在哪儿 ?
        a24df6838a47:对呀 这个方法在哪呢?
      • brownfeng:学习了
      • HRSLN:这么写我左上角有返回别的app的时候那个返回的也会被覆盖吧 还能返回别的app吗
      • 茄子_Apple:需要看demo,帖出来的代码不全啊
      • 薛定谔的黑猫警长:有回到顶端的demo吗 ?加我QQ380292393,谢谢
      • dcb739f00b41:如何使用呢
      • 戴仓薯:怎么用得着这么麻烦……就是一个scrollsToTop=YES的事啊
        戴仓薯:@Hissia 屏幕上只有一个tableView的时候自然就会有这效果,如果有其他scrollView只需把其他的scrollsToTop改成No
        885389eb08b2:@coderboy001 用scrollsToTop = YES怎么写,能否分享一下?
        coderboy001:@戴仓薯 嗯嗯,scrollsToTop=YES是可以的,只不过在一个控制器上有多个UIScrollView时,需要在每个UIScrollView都写一遍,比较分散. 我的这种方式代码量的确偏多,但是这种整体的设计思想作为一种解决问题的方式还是有他的意义 谢谢你哟
      • 屈涯:挺好的
      • 菲式爱情:多谢分享

      本文标题:ios开发之-点击屏幕顶部StatusBar让UIScrollV

      本文链接:https://www.haomeiwen.com/subject/eplflttx.html