2012-11-28 100 views
0

通過觸摸事件傳遞到所有子視圖的最佳方式是什麼?直通觸摸事件

的ViewController - >視圖 - >(subview1,subview2)

我想subview1 & subview2到兩個觸摸事件做出響應。

回答

1

將子視圖上的標籤設置爲等於通知標籤。然後通過查找這些標籤的視圖進行樹搜索。不幸的是,沒有子類化,沒有一種好方法可以做到這一點。如果你願意繼承子類,那麼你可以繼承子類,然後觸發一個NSNotification,該子類的所有其他視圖都會監聽。

1

在父母的觸摸處理,你可以遍歷該視圖的子視圖,並調用相同的處理程序:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    for(UIView *subview in [self.view subviews]) { 
     [subview touchesBegan:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    for(UIView *subview in [self.view subviews]) { 
     [subview touchesMoved:touches withEvent:event]; 
    } 
} 

或者,如果你需要確定具體的子視圖,您可以指定整數標籤的子視圖以後識別:

- (void)loadView { 
    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(10,10,10,10)]; 
    view1.tag = 100; 
    [self.view addSubview:view1]; 

    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(20,20,20,20)]; 
    view2.tag = 200; 
    [self.view addSubview:view2]; 

} 

再後來在由觸摸事件調用的方法的ViewController

- (void)touchEventResponder { 
    UIView *view1 = [self.view viewWithTag:100]; 
    // Do work with view1 
    UIView *view2 = [self.view viewWithTag:200]; 
    // Do work with view2 
} 
+0

有沒有辦法讓觸摸事件通過並讓他們的默認處理程序處理它們?例如,我有一個滑動手勢識別器,可以關閉疊加層,我希望下面的滾動視圖同時接收滾動觸摸事件。 – nmock

+0

@nmock看到我更新的答案(至少是第一個代碼示例)。 。 。應該將觸摸事件信息通過父項傳遞給子視圖。但請注意,即使子視圖不覆蓋用戶觸摸的父級部分,只要觸摸了父級,它就會將觸摸事件傳遞給所有子視圖。 – jal72088

+0

我試過這樣做,但它仍然沒有工作......我有一個UITapGestureRecognizer附加到「subview1」視圖,但它仍然不想回應觸摸事件。我將UIView分類爲疊加視圖並將所有觸摸事件傳遞給子視圖,但仍然無效。我可以通過在視圖下面調用bringSubviewToFront來實現它,它響應觸摸,但它會出現在前面。有任何想法嗎?我偶然發現了一個項目(https://github.com/spoletto/SquareQuote),它包含覆蓋層和下面的視圖,但我無法弄清楚他們是如何做到的。 – nmock