UIStatusBar的点击

1 UIStatusBar的系统点击事件

UIStatusBar的点击_第1张图片
9140338F-2789-434F-9867-79087E45A939.png

系统默认的点击状态栏时,scrollView的内容返回到顶部,如图所示.原因是默认情况下scrollView 的scrollsToTop属性为YES.
scrollsToTop的使用场景:当页面中只有一个scrollView的scrollsToTop属性为YES时,点击状态栏, scrollView的内容才会返回到顶部,如果像上图页面一样,有多个scrollView(精华页面,推荐,视频,图片等都是scrollView),且每个scrollView的scrollsToTop默认都为YES,点击状态栏是,scrollView的内容就不会滚动.为解决这个问题,实现方法有以下几种:

2 恢复UIStatusBar的系统点击

2.1 方法一:在UIStatusBar上覆盖一个透明的UIWindow,并添加点击事件

// 全局变量保存新建的窗口,否则是局部变量,程序启动后会销毁
static UIWindow *topWindow_; 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 程序启动完毕那一刻的所有窗口都必须要设置rootViewController,由于新建的   topWindow_ 没有rootViewController ,所以延迟到程序启动后执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 创建一个新的窗口
        topWindow_ = [[UIWindow alloc] init];
        topWindow_.windowLevel = UIWindowLevelAlert;
        topWindow_.backgroundColor = [UIColor redColor];
        topWindow_.frame = [UIApplication sharedApplication].statusBarFrame;
        topWindow_.hidden = NO;
        [topWindow_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
    });
}

- (void)topWindowClick
{
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    [self searchAllScrollViewsInView:window];
}

/**
 *  查找view中的所有scrollView
 */
- (void)searchAllScrollViewsInView:(UIView *)view
{
    // 递归遍历所有的子控件
    for (UIView *subview in view.subviews) {
        [self searchAllScrollViewsInView:subview];
    }
    
    // 如果不是UIScrollView,直接返回
    if (![view isKindOfClass:[UIScrollView class]]) return;
    
    // 是scrollView,将内容滚动到最前面
    UIScrollView *scrollView = (UIScrollView *)view;
    CGPoint offset = scrollView.contentOffset;
    offset.y =  - scrollView.contentInset.top;
    [scrollView setContentOffset:offset animated:YES];
}

缺陷:
(1) 点击状态栏时,所有的scrollView的内容都会返回到顶部,用户体验不好

你可能感兴趣的:(UIStatusBar的点击)