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];
网友评论