2013-03-06 55 views
2

我有一個UIViewController。根UIView包含一個用於在網格(ThumbnailGrid類)中顯示縮略圖圖像的自定義UIScrollView。這個網格可以包含很多顯示圖像的UIViews(GridTile類)。由於有許多網格圖塊,用戶可以向下滾動ThumbnailGrid。我只想加載用戶可以看到的網格圖像的圖像,我不想加載網格圖像的邊緣以外的圖像。是否顯示UIView?

如何確定這些GridTile UIViews中的一個是否正在屏幕上顯示或不顯示?

我試過以下,但它似乎總是返回false。

- (bool) isViewDisplayed:(UIView*)view 
{ 
     CGRect viewFrame = view.frame; 
     CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 
     if (CGRectIntersectsRect(viewFrame, appFrame)) return true; 
     return false; 
} 

我錯過了什麼嗎?

在此先感謝您的幫助!

編輯

的解

原來的座標系是錯誤的,所以我得到的,其中方法應返回真實,而是返回false,反之亦然一些奇怪的事件。

- (bool) isViewDisplated:(UIView*)view 
{ 
    CGRect viewFrame = [parentOfView convertRect:view.frame toView:nil]; 
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 
    if (CGRectIntersectsRect(viewFrame, appFrame)) return true; 
    return false; 
} 
+0

ThumbnailGrid類是您創建的自定義類還是您正在使用的框架? – JiuJitsuCoder 2013-03-06 15:37:44

+0

這是我自己創建的UIScrollView的子類。沒什麼特別的,只是包含以某種方式操縱子視圖的方法。 – 2013-03-06 15:39:51

回答

7

您還需要RECT轉化爲正確的座標系:

- (bool)isViewDisplayed:(UIView*)view 
{ 
    if (view.window) { 
     CGRect viewFrame = [view.window convertRect:view.frame fromView:view.superview]; 
     CGRect screenFrame = view.window.bounds; 
     return CGRectIntersectsRect(viewFrame, screenFrame); 
    } 
    return false; 
} 
+0

非常感謝!這個答案幫助我得到了解決方案(編輯我的問題,添加了我使用的解決方案)。基本上我沒有把我的矩形轉換成正確的座標系(愚蠢的我)。 – 2013-03-06 16:13:03

-4

使用易於管理的標籤。 像這樣的東西

UIView *view1 = [UIView]alloc]init]; 
view1.tag = 1; 
[mainView addSubview:view1 

];

,並檢查

UIView *temp = [mainView.view viewWithTag:1]; 
if(temp!=nil)return YES; 
else NO; 

看看這有助於

+0

if mainView是一個UIView。 mainView.view不正確。即使在父視圖的框架之外,視圖也可能是子視圖。 – Rakesh 2013-03-06 15:40:43

0

我知道這並不直接回答你的問題,但仍然:你爲什麼不使用UICollectionView?它能夠爲您處理大部分沉重的零件。你不必關心他們在屏幕之外的人。你只關心行爲(委託)和內容(數據源)。

+0

我試過使用UICollectionView,但它並沒有按照我想要的方式做事情。很難解釋我的確切原因,但基本上UICollectionView是不可能的這個項目。 – 2013-03-06 15:44:21

+0

@DavidOmid夠公平的。這只是一個建議。 – Peres 2013-03-06 15:46:33

0

老實說,我認爲你會以錯誤的方式去做。有很多現有的框架旨在完成這一工作。我不知道我是否會花時間手動推出自己的解決方案,並處理所有的內存和視圖管理。看看這篇文章:Grid of images in iOS

0

你可以做一個比較,這樣的:

NSMutableArray *outArray = [NSMutableArray array]; 
    NSMutableArray *inArray = [NSMutableArray array]; 


for (UIView *vw in rootView.subViews){ 
    if(vw.frame.origin.x <0 || vw.framew.origin.x >rootView.frame.size.width){ 
    [outArray addObject:vw]; 
    }else if(vw.frame.origin.y <0 || vw.framew.origin.y >rootView.frame.size.height){ 
    [outArray addObject:vw]; 
    }else{ 
    [inArray addObject:vw]; 
    } 
} 

那麼,到底你outArray將包含所有這些都部分地/完全擺脫超級視圖和inArray將所有的意見那些完全在超級視圖內的視圖。 如果你想使用一種方法(比如-(bool)isViewDisplayed:(UIView*)vw)檢查單個視圖,for循環中的相同代碼就足夠了,唯一的問題是你必須返回true/false而不是添加到數組中

PS :如果您只希望獲得完全超出您的超級觀點的觀看次數,那麼不要與針對-vw.frame.size.width & -vw.frame.size.height的零檢查進行比較。