点击状态栏,回到顶部(系统自带就有),其实现原理:
设想一:监听状态栏点击
不可取--因为获取不懂状态栏的控件,系统没有暴露
设想二:往窗口上添加一个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; }