iOS判斷View是否正在顯示

有時(shí)候在做一些工程時(shí)候?yàn)榱艘曈X美化需要將一些view隱藏顯示,還有的情況需要看是不是正在顯示。

1.增加標(biāo)識。

BOOL isShow,添加到superView時(shí),isShow = YES,從superView移除時(shí),isShow = NO。

2.遍歷所有子視圖進(jìn)行操作,這樣可以同時(shí)對多個(gè)子視圖進(jìn)行操做,移除視圖釋放內(nèi)存等。

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

3.IOS判斷當(dāng)前UIViewController 是否正在顯示。

某些情況下,需判斷當(dāng)前ViewController是否正在顯示,比如后臺網(wǎng)絡(luò)請求報(bào)錯(cuò),我們可能只希望在發(fā)起請求的頁面彈窗提示用戶,當(dāng)用戶已經(jīng)跳轉(zhuǎn)到其他界面,不做彈窗,減少對用戶的干擾。

假如一個(gè)UIView對象當(dāng)前正在顯示,那么它的window屬性肯定為非空值。雖然官方文檔未說明UIView未顯示時(shí)window屬性的取值, 但是經(jīng)過簡單的測試,大部分情況下UIView未顯示時(shí),window的值為空,因此依據(jù)此判斷當(dāng)前UIViewController是否正在顯示。但是 訪問UIViewController的view屬性時(shí),可能會引起view加載(假如此時(shí)還未加載),這是不必要的,而且還可能引起無法預(yù)期的問題。因 此在訪問view屬性之前,最好先檢查isViewLoaded屬性來避免上述問題。

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

4.如何判斷一個(gè)view 是否在另外一個(gè)view范圍內(nèi)。

其原理是將兩個(gè)view的坐標(biāo)convert 到相對于同一個(gè)view的坐標(biāo),再對比。

   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;
    
    // 轉(zhuǎn)換view對應(yīng)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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容