UIScrollView回滚到顶部解决方案

2017-09-06  本文已影响486人  Coder007

UIScrollView回滚到顶部解决方案

iOS9之前的处理方案

// 顶部的window,覆盖在状态栏上面,点击之后将window上显示的scrollView滑动到顶部
#import <Foundation/Foundation.h>

@interface YWTopWindow : NSObject

+ (void)show;

+ (void)hide;

@end


#import "YWTopWindow.h"
#import "UIView+YWExtension.h"

@implementation YWTopWindow

static UIWindow *window_;

+ (void)initialize
{
    window_ = [[UIWindow alloc] init];
    window_.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20);
    window_.backgroundColor = [UIColor clearColor];
    // 将级别设置为最高,这样就能盖住状态栏
    window_.windowLevel = UIWindowLevelAlert;
    [window_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(windowClick)]];
}

+ (void)show
{
    // iOS9之前,可以直接写window_.hidden = NO;
    // 在iOS9之后,直接写会报错,大概的意思就是:在程序启动结束后,window需要有一个根控制器
    // Application windows are expected to have a root view controller at the end of application launch
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        window_.hidden = NO;
    });
}

+ (void)hide
{
    window_.hidden = YES;
}


/**
 窗口点击
 */
+ (void)windowClick
{
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    [self searchScrollViewInView:window];
}

+ (void)searchScrollViewInView:(UIView *)superview
{
    for (UIScrollView *subView in superview.subviews) {
        // 如果是UIScrollView,滚动到最顶部
        if([subView isKindOfClass:[UIScrollView class]] && subView.isShowingOnKeyWindow){
            CGPoint offset = subView.contentOffset;
            offset.y = - subView.contentInset.top;
            [subView setContentOffset:offset animated:YES];
        }
        // 不是UIScrollView或者不是显示在keyWindow上,继续寻找
        [self searchScrollViewInView:subView];
    }
}
@end

// 写在UIView的分类中的方法
// 判断一个控件是否显示在主窗口上面
- (BOOL)isShowingOnKeyWindow
{
    // 主窗口
    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    
    // 以主窗口左上角为坐标原点,计算self的矩形框
    CGRect newFrame = [keyWindow convertRect:self.frame fromView:self.superview];
    CGRect winBounds = keyWindow.bounds;
    
    // 主窗口的bounds和self的矩形框是否有重叠
    BOOL intersects = CGRectIntersectsRect(newFrame, winBounds);
    
    return !self.isHidden && self.alpha > 0.01 && self.window == keyWindow && intersects;
}

iOS9之后(包含iOS9)

上一篇 下一篇

猜你喜欢

热点阅读