我有兩個子視圖(topChild
)(bottomChild
)的一個視圖(parent
)。同級子視圖不會在iPhone中收到觸摸
如果我點擊屏幕上只有topChild
和parent
接收觸摸事件。
我應該更改什麼來將觸摸事件傳播到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];
}
凡MYView
是UIView
一個子類,只記錄touchesBegan
。
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"%d", self.tag);
[super touchesBegan:touches withEvent:event];
}
結果:
觸摸綠色區域生成以下日誌:
TouchTest[25062:f803] 1
TouchTest[25062:f803] 3
我的第一個想法是使parent
傳播所有touchesSomething
調用其子但(A)我懷疑可能有一個更容易的解決方案n和(B)我不知道哪個孩子將事件發送給父母,並且發送兩次到相同視圖的消息可能會導致欺騙。
提問後,我發現這個post建議覆蓋hitTest
來更改接收觸摸的視圖。我會嘗試這種方法,並更新問題,如果它的工作。
感謝亞當!這個解決方案是否與手勢識別器兼容?乍一看,如果我走這條路線,我將不得不重新實現車輪。 – hpique 2011-12-18 22:13:15
而且我非常想重新組織結構,但是我沒有看到我的情況如何。 topChild具有透明度,topChild和bottomChild都可以「移動」(因此topChild不能成爲bottomChild的子視圖),並且都需要響應觸摸。 – hpique 2011-12-18 22:14:29
應該有可能,您只需將回調接收的gestureRecognizer對象傳遞給父級,而不是簡單的觸摸。至少在這個項目中我很方便,這對於UIPinchGestureRecognizer來說很有用。 – 2011-12-18 22:17:21