点击状态栏,回到顶部(系统自带就有),其实现原理:
设想一:监听状态栏点击
不可取--因为获取不懂状态栏的控件,系统没有暴露
设想二:往窗口上添加一个View,挡住状态栏
不可取--因为添加后,View视图还是在状态栏的下面,没法挡住;状态栏是另外一个窗口
设想三:创建状态栏窗口
代码如下:
#import "StatueWindow.h"
//静态的全局变量
static StatueWindow *_statusW;
@implementation StatueWindow
+ (void)show {
StatueWindow *statueW = [[StatueWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44)];
statueW.backgroundColor = [UIColor redColor];
statueW.rootViewController = [[UIViewController alloc] init];
statueW.hidden = NO;
statueW.windowLevel = UIWindowLevelAlert;
//如果不设置这一行,是不会显示的,因为没有强应用,一调用就被释放掉了
_statusW = statueW;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"---点击了状态栏-----");
//拿到taleview返回到顶部
//遍历窗口所有的子控件,看有没有tableView
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
UITableView *tableView = [self fecthChildView:keyWindow];
[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top)];
}
//获取控件的所有子控件
- (UITableView *)fecthChildView:(UIView *)view {
for (UIView *childView in view.subviews) {
if ([childView isKindOfClass:[UITableView class]]) {
NSLog(@"----%@--",childView);
return (UITableView *)childView;
}
UITableView *tableView = [self fecthChildView:childView];
if (tableView) {
return tableView;
}
}
return nil;
}
创建完继承于UIWindow后的“StatueWindow”,将satueWindow添加到视图上:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[ViewController alloc] init];
[self.window makeKeyAndVisible];
// UIView *stateView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 24)];
// stateView.backgroundColor = [UIColor redColor];
// [self.window addSubview:stateView];
[StatueWindow show];
return YES;
}