2011-08-26 48 views
1

我在應用程序窗口的座標中有一個CGPoint點。
有沒有辦法獲得一個指向視圖可見的指針?在某個點獲取可見視圖

例如我有100個視圖或隨機大小,並放置在隨機位置 - 部分/完全覆蓋對方。
按下應用程序中的按鈕將列出(0,0),(100,100)和(200,200)處可見視圖的地址。
視圖可能會或可能不會啓用userInteraction。
另外,一個視圖被完全透明的視圖覆蓋的更復雜場景呢?

回答

7

更新
hitTest,因爲它不會給你的子樹而父母有userInteractionEnabled設置爲NO或視圖是其父的範圍之外將無法正常工作。

visibleViewAtPoint如下所述將解析整個視圖樹併爲視圖提供最高的子視圖索引。這應該給正確的觀點(不帶Z順序考慮...)

- (void) findView:(UIView**)visibleView atPoint:(CGPoint)pt fromParent:(UIView*)parentView 
{ 
    UIView *applicationWindowView = [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]; 

    if(parentView == nil) { 
     parentView = applicationWindowView; 
    } 

    for(UIView *view in parentView.subviews) 
    {   
     if((view.superview != nil) && (view.hidden == NO) && (view.alpha > 0)) 
     { 
      CGPoint pointInView = [applicationWindowView convertPoint:pt toView:view]; 

      if([view pointInside:pointInView withEvent:nil]) { 
       *visibleView = view; 
      } 

      [self findView:visibleView atPoint:pt fromParent:view]; 
     } 
    } 
} 

- (UIView*) visibleViewAtPoint:(CGPoint)pt 
{ 
    UIView *visibleView = nil; 
    [self findView:&visibleView atPoint:pt fromParent:nil]; 

    return visibleView; 
} 
+0

目前該代碼未檢測到UIAlertView中,或如​​UIPickerView等「彈出的意見多數民衆贊成竊聽後呈現UIWebView中的下拉列表。這個代碼是可以修改的,還是屬於「超出父級範圍的視圖」的情況?如果是後者,您還能如何檢測和檢索這些視圖? –

+0

UIAlertView維護它自己的UIScreen,它將在視圖控制器視圖之外,所以這種方法不適用於此。您可能需要追蹤UIAlertView的屏幕(以某種方式)並在那裏執行此方法。 –

相關問題