2020 Note

1、检测view在特定前提下是否可见
简短的代码很难检测当前视图是否在屏幕上可见,因为存在被兄弟视图或者父视图被叔辈视图完全遮挡的情况,其实也没有必要写大量的代码去实现通用的逻辑,在大前提下能判断时,针对特定情况在添加少量代码即可实现最终目的,效率自然也是最高的。
UIView的window属性为nil的几种情况

  • 父视图为nil
  • 父视图的父视图为nil,以及父父父父...视图(非主窗口)为nil
  • 离开导航栈顶
  • 非tabBarController的选中视图
@implementation UIView (CheckVisible)
+ (BOOL)_checkVisible:(UIView *)view inView:(UIView *)inView
{
    if(!inView){
        return YES;
    }
    CGRect frameInView = view.frame;
    if(inView!=view.superview){
        frameInView = [inView convertRect:view.frame fromView:view.superview];
    }
    if(CGRectIntersectsRect(frameInView, inView.bounds))
    {
        return [self _checkVisible:view inView:inView.superview];
    }
    return NO;
}

- (BOOL)checkVisibleOnScreen
{
    if(self.hidden){
        return NO;
    }
    if(!self.window){
        return NO;
    }
    if(!self.superview){
        return NO;
    }
    return [UIView _checkVisible:self inView:self.superview];
}

@end

CGRectIntersectsRect 检测两个rect是否相交
https://developer.apple.com/documentation/coregraphics/1454747-cgrectintersectsrect

你可能感兴趣的:(2020 Note)