如何让页面中有多个UIScrollView时支持statusbar点击回顶部的功能

在做PagerTabhttps://github.com/ming1016/PagerTab这个滑动切换多页面的控件时发现如果有多个scroll view系统的点击statusbar滚动回顶部功能就会失效,查了些资料找到了解决的办法,现记录下。

主要思路是先创建一个UIWindow对象给它添加一个tap手势

static UIWindow *topWinow;

+ (void)initialize {
    topWinow = [[UIWindow alloc] init];
    topWinow.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20);
    topWinow.windowLevel = UIWindowLevelAlert;
    [topWinow addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(winTap)]];
}

递归搜索所有view查找当前位置合适的scroll view使其能够滚动到顶部

+ (void)seachScrollViewInView:(UIView *)view {
    for (UIScrollView *subView in view.subviews) {
        if ([subView isKindOfClass:[UIScrollView class]] && [self isCurrentShowView:subView]) {
            //开始进行滚动
            CGPoint offset = subView.contentOffset;
            offset.y = -subView.contentInset.top;
            [subView setContentOffset:offset animated:YES];
        }
        //寻找子视图的子视图
        [self seachScrollViewInView:subView];
    }
}

//根据位置判断是否合适
+ (BOOL)isCurrentShowView:(UIView *)view {
    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    CGRect currentFrame = [keyWindow convertRect:view.frame fromView:view.superview];
    CGRect winBounds = keyWindow.bounds;
    BOOL intersects = CGRectIntersectsRect(currentFrame, winBounds);
    return !view.isHidden && view.alpha > 0.01 && view.window == keyWindow && intersects;
}

这部分的修改已经push到github上完整的实现代码可以在PagerTab的Helper/SMTopWindow.m里看到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容