sol*_*sol 5 iphone touch subview uiview ipad
我有一个UIView,它有一堆子视图.子视图应该能够接收触摸事件,但由于某种原因,父UIView接受触摸并且不传递它.我以非常标准的方式创建它,就像我总是创建视图一样:
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1024,768)];
self.mainView = myView;
[myView release];
[self.view addSubview:self.mainView];
Run Code Online (Sandbox Code Playgroud)
然后我创建子视图并正常添加它们:
[self.mainView addSubview:someOtherView];
Run Code Online (Sandbox Code Playgroud)
我知道self.mainView在我在主UIWindow中收听时会得到触摸事件:
VIEW: <UIView: 0x8d34aa0; frame = (0 0; 1024 768);
Run Code Online (Sandbox Code Playgroud)
但为什么在这个世界上我不能让子视图接受接触?我不明白为什么有时会发生这种情况.我没有改变mainView的任何默认属性.
Min*_*sai 12
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];
}
Run Code Online (Sandbox Code Playgroud)
注意:从子视图开始使用的反向枚举器是从后到前排序的,我们希望首先测试最前面的视图.