![](/img/trans.png)
[英]iPhone sdk Cocoa Touch - Pass touches down from parent UIView to child UIScrollview
[英]iphone/ipad - parent UIView is blocking touches from getting to subviews - why?
我有一個UIView,它有一堆子視圖。 子視圖應該能夠接收觸摸事件,但由於某種原因,父UIView接受觸摸並且不傳遞它。 我以非常標准的方式創建它,就像我總是創建視圖一樣:
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1024,768)];
self.mainView = myView;
[myView release];
[self.view addSubview:self.mainView];
然后我創建子視圖並正常添加它們:
[self.mainView addSubview:someOtherView];
我知道self.mainView在我在主UIWindow中收聽時會得到觸摸事件:
VIEW: <UIView: 0x8d34aa0; frame = (0 0; 1024 768);
但為什么在這個世界上我不能讓子視圖接受接觸? 我不明白為什么有時會發生這種情況。 我沒有改變mainView的任何默認屬性。
與父視圖的框架有關。 如果框架未包含子視圖,則它們將不會接收到觸摸。
UIView觸摸不會傳遞給子視圖,如果它們位於解決方案所提到的超視圖范圍之外。
但是,如果您希望這些子視圖響應觸摸,請覆蓋hitTest:withEvent:
.
觸摸事件。 窗口對象使用命中測試和響應者鏈來查找接收觸摸事件的視圖。 在命中測試中,窗口在視圖層次結構的最頂層視圖上調用hitTest:withEvent: 此方法通過在視圖層次結構中返回YES的每個視圖上遞歸調用pointInside:withEvent:繼續執行,繼續向下移動層次結構,直到找到觸摸發生在其邊界內的子視圖。 該視圖成為熱門測試視圖。
在子類中添加以下方法:
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator];
UIView *iSubView;
while ((iSubView = [reverseE nextObject])) {
UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event];
if(viewWasHit) {
return viewWasHit;
}
}
return [super hitTest:point withEvent:event];
}
注意:從子視圖開始使用的反向枚舉器是從后到前排序的,我們希望首先測試最前面的視圖。
你是否觸摸處理程序調用超類處理程序?
例如,在你的觸摸開始,打電話:
[super touchesBegan:touches withEvent:event];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.