iOS判断View是否正在显示

作者: 一亩三分甜 | 来源:发表于2018-10-18 22:41 被阅读341次

    有时候在做一些工程时候为了视觉美化需要将一些view隐藏显示,还有的情况需要看是不是正在显示。

    1.增加标识。

    BOOL isShow,添加到superView时,isShow = YES,从superView移除时,isShow = NO。

    2.遍历所有子视图进行操作,这样可以同时对多个子视图进行操做,移除视图释放内存等。

    for(UIView * view in [self.view subviews])
    {
      if(View isKindOfCless:[OneViewObject class])
      {
                //...
       }
    }
    

    3.IOS判断当前UIViewController 是否正在显示。

    某些情况下,需判断当前ViewController是否正在显示,比如后台网络请求报错,我们可能只希望在发起请求的页面弹窗提示用户,当用户已经跳转到其他界面,不做弹窗,减少对用户的干扰。

    假如一个UIView对象当前正在显示,那么它的window属性肯定为非空值。虽然官方文档未说明UIView未显示时window属性的取值, 但是经过简单的测试,大部分情况下UIView未显示时,window的值为空,因此依据此判断当前UIViewController是否正在显示。但是 访问UIViewController的view属性时,可能会引起view加载(假如此时还未加载),这是不必要的,而且还可能引起无法预期的问题。因 此在访问view属性之前,最好先检查isViewLoaded属性来避免上述问题。

    - (BOOL)isVisible {
        return (self.isViewLoaded && self.view.window);
    }
    

    4.如何判断一个view 是否在另外一个view范围内。

    其原理是将两个view的坐标convert 到相对于同一个view的坐标,再对比。

       CGRect rect = [_testButton convertRect:_testButton.frame toView:self.view];
        if (CGRectIntersectsRect(self.view.frame, rect)) {
            NSLog(@"true");
        }else{
            NSLog(@"false");
        }
    

    5.通过添加类别判断View是否显示。

    #import <UIKit/UIKit.h>
    
    @interface UIView (UIScreenDisplaying)
    // 判断View是否显示在屏幕上
    - (BOOL)isDisplayedInScreen;
    @end
    #import "UIView+UIScreenDisplaying.h"
    
    @implementation UIView (UIScreenDisplaying)
    // 判断View是否显示在屏幕上
    - (BOOL)isDisplayedInScreen
    {
        if (self == nil) {
            return FALSE;
        }
        
        CGRect screenRect = [UIScreen mainScreen].bounds;
        
        // 转换view对应window的Rect
        CGRect rect = [self convertRect:self.frame fromView:nil];
        if (CGRectIsEmpty(rect) || CGRectIsNull(rect)) {
            return FALSE;
        }
        
        // 若view 隐藏
        if (self.hidden) {
            return FALSE;
        }
        
        // 若没有superview
        if (self.superview == nil) {
            return FALSE;
        }
        
        // 若size为CGrectZero
        if (CGSizeEqualToSize(rect.size, CGSizeZero)) {
            return  FALSE;
        }
        
        // 获取 该view与window 交叉的 Rect
        CGRect intersectionRect = CGRectIntersection(rect, screenRect);
        if (CGRectIsEmpty(intersectionRect) || CGRectIsNull(intersectionRect)) {
            return FALSE;
        }
        
        return TRUE;
    }
    @end

    相关文章

      网友评论

        本文标题:iOS判断View是否正在显示

        本文链接:https://www.haomeiwen.com/subject/mxdezftx.html