iOS点击状态栏回到顶部(一个控制器中包含多个scrollview,系统自带的回到顶部失效)

1:创建一个UIWindow,放在状态栏上面。

/** 位于状态栏,用于返回顶部*/
@property (nonatomic, strong) UIWindow *topWindow;

2:在viewDidLoad方法中创建。

- (void)viewDidLoad {
    [super viewDidLoad];

    //创建顶部window
    [self topWindow];
}

3:添加顶部window,并实现点击功能。

#pragma mark - 添加顶部状态栏窗口
- (UIWindow *)topWindow
{
    if (!_topWindow) {
        _topWindow = [[UIWindow alloc] init];
        UIViewController *vc = [[UIViewController alloc] init];
        _topWindow.rootViewController = vc;
        _topWindow.frame = CGRectMake(0, 0, kScreenWidth, 20);
        _topWindow.hidden = NO;
        _topWindow.backgroundColor = [UIColor clearColor];
        [_topWindow addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
    }
    return _topWindow;
}

- (void)topWindowClick
{
    // 取出所有的window
    NSArray *windows = [UIApplication sharedApplication].windows;
    // 遍历程序中的所有控件
    for (UIWindow *window in windows) {
        [self searchSubviews:window];
    }
}

// 搜索superview内部的所有子控件
- (void)searchSubviews:(UIView *)superview
{
    for (UIScrollView *scrollView in superview.subviews) {
        [self searchSubviews:scrollView];
        // 判断是否为scrollView
        if (![scrollView isKindOfClass:[UIScrollView class]]) continue;
        // 计算出scrollView在window坐标系上的矩形框
        CGRect scrollViewRect = [scrollView convertRect:scrollView.bounds toView:scrollView.window];
        CGRect windowRect = scrollView.window.bounds;
        // 判断scrollView的边框是否和window的边框交叉
        if (!CGRectIntersectsRect(scrollViewRect, windowRect)) continue;
        // 让scrollView滚动到最前面
        CGPoint offset = scrollView.contentOffset;
        // 偏移量不一定是0
        offset.y = - scrollView.contentInset.top;
        [scrollView setContentOffset:offset animated:YES];
    }
}

4:在控制器出现的时候,改变window的级别为UIWindowLevelAlert,消失的时候级别为UIWindowLevelNormal;以保证别处在使用的时候,不影响。

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    _topWindow.windowLevel = UIWindowLevelAlert;
    
}
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    _topWindow.windowLevel = UIWindowLevelNormal;
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值