自定义监听状态栏点击

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义监听状态栏点击相关的知识,希望对你有一定的参考价值。

问题描述:
     对于UIScrollView系统自带功能[点击状态栏返回顶部],但是这有局限性,当我们自己创建的UIScrollView过多时系统就会不知道返回哪一个的UIScrollView返回顶部,就会失效,所以这时就需要我们自己实现这个功能.
方法措施:
在状态栏覆盖一个window,我们创建一个UIWindow *topWindow;对象 
     摸索阶段:
     我们将window的尺寸设置为状态栏的尺寸正好实现覆盖状态栏,
  topWindow.frame = application.statusBarFrame;
  但是,依然显示不出来,原因在于被系统的状态栏覆盖,覆盖的原因是需要设置窗口的优先级,如下图所示
  技术分享
    具体设置如下:
   topWindow.windowLevel = UIWindowLevelAlert;
   topWindow.hidden = NO;
  设置window的根控制器如下:
     //设置根控制器,最好自定义一个控制器,可以设置控制器里面的一些属性和方法 这里用一个TestViewController
   topWindow.rootViewController = [[TestViewController alloc] init];
   topWindow.rootViewController.view.backgroundColor = [UIColor clearColor];
   topWindow.rootViewController.view.frame = application.statusBarFrame;
     //设置当屏幕旋转的时候覆盖状态栏的根控制器可以跟随屏幕实现宽度自适应
   topWindow.rootViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  设置TestViewController控制器的方法:
     技术分享
          这样状态栏就可以显示出来了
  显示顶层window 
     注意:要给topWindow一个强引用才能显示出来,不然window就被销毁了,导致无法显示.
                由顶层window的根控制器决定状态栏的状态;
 
深度优化:
为了方便使用,我们可以将其封装成一个实现简单功能的小框架 — 使用block传递参数
方法实现:
     自定义JLWindow 继承自UIWindow,提供一个快速实现的类方法如下:
     技术分享
    在实现这个类方法时,由于代码并不是特别多,因此我们可以把里面需要用到的一个控制器与其写在一个.m文件中,效果如下:
     技术分享
     关于window的设置,我们首先需要提供一个全局变量(因为在这不必提供成员变量,一个全局变量即可)
     技术分享
     这样这个功能模块的封装就已经完成了,当我们使用的时候只需要导入头文件即可,效果如下:
     技术分享

以上是关于自定义监听状态栏点击的主要内容,如果未能解决你的问题,请参考以下文章

xcode UIButton创建监听按钮点击自定义按钮 状态 内边距

chrome状态栏和菜单的字体怎么调?

ios 11 自定义导航栏位于状态栏下方

Flutter中如何自定义状态栏?

带有页面视图的自定义导航栏 [Flutter]

如何自定义状态栏图标和文字颜色?例如。状态栏背景:白色,状态栏图标颜色,文字:红色