有時(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