标签:
问题描述:
对于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的设置,我们首先需要提供一个全局变量(因为在这不必提供成员变量,一个全局变量即可)
这样这个功能模块的封装就已经完成了,当我们使用的时候只需要导入头文件即可,效果如下:
自定义监听状态栏点击
标签:
原文地址:http://www.cnblogs.com/coyoko/p/5165052.html