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