2013-02-01 31 views
1

我有3個相同大小的UIViews堆疊在一起。最頂端是透明的,僅用於檢測觸摸。檢測到的觸摸類型將決定我想要接收觸摸事件的其他兩個基礎視圖中的哪一個。一旦最上面的視圖完成觸摸,我需要將觸摸事件轉發到正確的基礎視圖。我怎樣才能做到這一點?iOS - 如何將觸摸轉發到底層uiview

編輯 - 我添加了我的觸摸檢測代碼。這在MainViewController中,其視圖包含所有3個子視圖。

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    for (UITouch *touch in touches) 
    { 
     if (touch.view == self.touchOverlay) { 
      CGPoint touchLocation = [touch locationInView:touch.view]; 

      //do a bunch of math to determine which view should get the touches. 
      if (viewAshouldGetTouches) //forward to viewA 
      if (viewBshouldGetTouches) //forward to viewB 


     } 
    } 
} 
+0

所有UIView的單個視圖的子視圖? – Putz1103

+0

@ Putz1103是的,他們是單個視圖的子視圖。我在視圖控制器中檢查touchesMoved等,而不是包含視圖。 – soleil

回答

1

你必須通過你的頂視圖中創建一個UIView子類,並覆蓋下面的方法來做到這一點:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    // UIView will be "transparent" for touch events if we return NO 
    return (point.y < MIDDLE_Y1 || point.y > MIDDLE_Y2); 
} 
+0

但是,如果我這樣做,我仍然可以檢查主視圖控制器的touchesMoved觸摸頂視圖?這就是我確定哪個底層視圖可以觸及的地方。 – soleil

3

讓你的兩個子視圖setUserInteractionEnabled:NO和處理所有觸摸父。然後,根據觸摸類型,將正確的視圖發送到編程觸摸事件。那麼你不需要在頂部有清晰的視角。基本上你會自下而上協調觸摸事件,而不是去頂部 - >底部 - >中間。

+0

我已經在上面添加了我的touchesMoved方法。你可以舉一個例子來說明如何從touchesMoved中發送一個編程觸摸事件的視圖嗎?基本上這兩個視圖都包含滾動視圖,如果視圖接收到觸摸事件,則需要正常滾動。 – soleil

+0

只需調用'[view1 touchesBegan:touches withEvent:event];'從touchesbegan裏面調用。我不確定scrollview能否正常使用,但在我的腦海中應該如此。 – Putz1103

+0

我需要view1來接收touchesMoved事件,但不是touchesBegan。從touchesMoved內部調用touchesMoved似乎會導致無限循環。 – soleil