点击状态栏返回顶部

点击状态栏,回到顶部(系统自带就有),其实现原理:

设想一:监听状态栏点击

  不可取--因为获取不懂状态栏的控件,系统没有暴露

设想二:往窗口上添加一个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;
}

 

posted @ 2019-10-21 18:29  一人前行  阅读(678)  评论(0编辑  收藏  举报