iOS view是否在此时是否屏幕内

判断view是否在屏幕内,这种实际情况也经常遇到,可以使用定时器,定时检查

- (void)startTaskWithView:(UIView *)view {
    _view = view;
    if (_view) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(beginCheck) userInfo:nil repeats:YES];
        [_timer fire];
    }
}
- (void)beginCheck {

    if([self isDisplayedInScreen]) {
        NSLog(@"在屏幕内");
        [_timer invalidate];
        _timer = nil;
    } else {
        NSLog(@"不在屏幕内");
    }
}

// 判断View是否显示在屏幕上
- (BOOL)isDisplayedInScreen
{
    if (_view == nil) {
        return NO;
    }

    CGRect screenRect = [UIScreen mainScreen].bounds;

    // 转换view对应window的Rect
    UIWindow *win= [UIApplication sharedApplication].keyWindow;
    CGRect rect = [_view convertRect:_view.frame toView:win];
    if (CGRectIsEmpty(rect) || CGRectIsNull(rect)) {
        return NO;
    }

    // 若view 隐藏
    if (_view.hidden) {
        return NO;
    }

    // 若没有superview
    if (_view.superview == nil) {
        return NO;
    }

    // 若size为CGrectZero
    if (CGSizeEqualToSize(rect.size, CGSizeZero)) {
        return  NO;
    }

    // 获取 该view与window 交叉的 Rect
    CGRect intersectionRect = CGRectIntersection(rect, screenRect);
    if (CGRectIsEmpty(intersectionRect) || CGRectIsNull(intersectionRect)) {
        return NO;
    }

    return YES;
}
经验分享 程序员 微信小程序 职场和发展