2013-04-17 38 views
4

我已經得到了全部具有用戶互動欄目(兒童)和所有全屏子視圖的堆棧。問題是,如果我降落在在堆棧的頂部的非交互部分,它不會再傳播整個堆棧的其餘部分是觸摸。我的設置:通過兄弟子視圖傳播觸摸事件?

視圖甲 --view B(全屏幕的容器,而不是本身交互但具有交互式子視圖) ----視圖B1(交互式) ----視圖B2(交互式) - 視圖C(與B相同) ----視圖C1(交互式) ----視圖C2(交互式)

B和C均爲全屏,但B1/B2/C1/C2都只是小屏幕的各個部分。

[a addSubview:b]; 
[a addSubview:c]; 

如果我碰任何東西C1/C2之外,我想觸摸事件,然後檢查是否到達全國各地B(B1/B2)的內部,而是它只是回A,並然後到A的父母。是否有可能做到這一點?如果我設置userInteractionEnabled NO在C,但在是C1/C2,它不會給那些內任何電話或者,雖然在這種情況下,則B會得到觸摸,符合市場預期。

編輯:截止了手動遍歷視圖棧檢查僅適用於某些子視圖,而不是所有的人:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 

    if (self != self.topCustomViewsContainer) {  
     for (UIView *v in self.createdSubviews) { 
      CGPoint newPoint = point; 
      newPoint.x -= v.frame.origin.x; 
      newPoint.y -= v.frame.origin.y; 
      UIView *hit = [v hitTest:newPoint withEvent:event]; 
      if (hit) 
       return hit; 
     } 
     return nil; 

    } 

    return [super hitTest:point withEvent:event]; 
} 

回答

8

一種可能性是覆蓋在視圖B的

​​

方法你可以把它返回只有當B的子視圖被擊中。試着這樣說:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *hitView = [super hitTest:point withEvent:event]; 
    if (hitView == self) { 
    return nil; 
    } else { 
    return hitView; 
    } 
} 
0

活動從孩子傳播了視圖層次結構父(如你發現)。所以兩種可能性發生的對我說:

使C B的孩子他們都具有相同的大小,和C顯然 已經有一個透明的背景,所以把它添加到B和使用[viewB bringSubviewToFront:viewC],使其成爲第一個獲得觸動。 任何它沒有捕獲的東西都會傳遞到它下面的視圖,然後 直到父母A.

或者:手動捕獲觸摸,並強制它們查看B(兄弟的C)。這包括在您的視圖控制器類實現這個

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [viewC touchesBegan:touches withEvent:event]; 
    // Note this could be in sibling B or in parent A, depending on which 
    // has a reference to the 'viewC' object 
} 
相關問題