首页 > 其他 > 详细

点击状态栏返回顶部

时间:2019-10-21 20:24:05      阅读:45      评论:0      收藏:0      [点我收藏+]

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

设想一:监听状态栏点击

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

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

 

点击状态栏返回顶部

原文:https://www.cnblogs.com/lyz0925/p/11715176.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!