2011-12-18 57 views
0

我有兩個子視圖(topChild)(bottomChild)的一個視圖(parent)。同級子視圖不會在iPhone中收到觸摸

如果我點擊屏幕上只有topChildparent接收觸摸事件。

我應該更改什麼來將觸摸事件傳播到bottomChild

代碼:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    MYView* parent = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    parent.tag = 3; 
    parent.backgroundColor = [UIColor redColor]; 

    MYView* bottomChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)]; 
    bottomChild.tag = 2; 
    bottomChild.backgroundColor = [UIColor blueColor]; 
    [parent addSubview:bottomChild]; 

    MYView* topChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)]; 
    topChild.tag = 1; 
    topChild.backgroundColor = [UIColor greenColor]; 
    [parent addSubview:topChild]; 
    [self.view addSubview:parent]; 
} 

MYViewUIView一個子類,只記錄touchesBegan

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"%d", self.tag); 
    [super touchesBegan:touches withEvent:event]; 
} 

結果:

enter image description here

觸摸綠色區域生成以下日誌:

TouchTest[25062:f803] 1 
TouchTest[25062:f803] 3 

我的第一個想法是使parent傳播所有touchesSomething調用其子但(A)我懷疑可能有一個更容易的解決方案n和(B)我不知道哪個孩子將事件發送給父母,並且發送兩次到相同視圖的消息可能會導致欺騙。

提問後,我發現這個post建議覆蓋hitTest來更改接收觸摸的視圖。我會嘗試這種方法,並更新問題,如果它的工作。

回答

1

這是一個有趣的問題,可能是通過重新思考結構化方式的最佳解決方案。但要使其按照建議的方式工作,需要在當前頂視圖中捕捉觸摸事件,將其傳遞給父級,然後通過父級視圖的所有子視圖向下傳播。爲了完成這項工作,您需要使用touchesBegan:(或其他任何用於攔截觸摸的方法)在所有視圖中不執行任何操作,僅在父視圖調用的方法中執行操作。

這是真正的另一種說法,不要處理視圖中的觸摸,捕捉它們,但通知父視圖視圖,然後根據需要調用子視圖方法以產生所需的效果。

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

    // Do nothing, parent view calls my parentNotifiedTouchesBegan method 
    [self.superview touchesBegan:touches withEvent:event]; 
} 

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

    // Act on the touch here just as my sibling views are doing 
} 

注意我的代碼改變superself.superview。您可能也可能不希望根據您正在進行的操作調用super的方法,並且要撥打的地方可能在parentNotifiedTouchesBegan

你可以知道哪個子視圖發送了當然的事件,只需使用自定義方法來通知超級視圖而不是調用它的touchesBegan:。使用self參數。

+0

感謝亞當!這個解決方案是否與手勢識別器兼容?乍一看,如果我走這條路線,我將不得不重新實現車輪。 – hpique 2011-12-18 22:13:15

+0

而且我非常想重新組織結構,但是我沒有看到我的情況如何。 topChild具有透明度,topChild和bottomChild都可以「移動」(因此topChild不能成爲bottomChild的子視圖),並且都需要響應觸摸。 – hpique 2011-12-18 22:14:29

+0

應該有可能,您只需將回調接收的gestureRecognizer對象傳遞給父級,而不是簡單的觸摸。至少在這個項目中我很方便,這對於UIPinchGestureRecognizer來說很有用。 – 2011-12-18 22:17:21

0

如果您不需要對孩子的觸摸然後設置

bottomChild.userInteractionEnabled = NO; 
topChild.userInteractionEnabled = NO; 
相關問題