判断UIView是否在屏幕上

2019-11-12  本文已影响0人  传说中的汽水枪

UIView(Category)

- (CGFloat)rx_showPercentDisplayedInScreen {
    // 未添加到superview
    if (self.superview == nil) {
        return 0;
    }
    // view 隐藏
    if (self.hidden) {
        return 0;
    }
    // 转换view对应window的Rect
    CGRect rect = [self convertRect:self.frame toView:nil];
    //如果可以滚动,清除偏移量
    if ([[self class] isSubclassOfClass:[UIScrollView class]]) {
        UIScrollView * scorll = (UIScrollView *)self;
        rect.origin.x += scorll.contentOffset.x;
        rect.origin.y += scorll.contentOffset.y;
    }
    if (CGRectIsEmpty(rect) || CGRectIsNull(rect) || CGSizeEqualToSize(rect.size, CGSizeZero)) {
        return 0;
    }
    // 获取 该view与window 交叉的 Rect
    CGRect screenRect = [UIScreen mainScreen].bounds;
    CGRect intersectionRect = CGRectIntersection(rect, screenRect);
    if (CGRectIsEmpty(intersectionRect) || CGRectIsNull(intersectionRect)) {
        return 0;
    }
    // 展示面积与实际面积的百分比
    CGFloat showPercent = intersectionRect.size.width * intersectionRect.size.height / (self.frame.size.width * self.frame.size.height);
    return showPercent;
}

注意

一定是:
CGRect rect = [self convertRect:self.frame toView:nil];
而不是:
CGRect rect = [self convertRect:self.frame fromView:nil];

上一篇 下一篇

猜你喜欢

热点阅读