编辑:天哪,你们我终于找到了方法!我创建了 UIView 的子类,并让我的游戏视图(包含所有 UIScrollView、UIButton 等)使用该子类。然后这是我添加到子类的唯一代码:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGPoint touchSpot = point;
if (![[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"] && touchSpot.y < 512)
{
touchSpot = CGPointMake(touchSpot.x, touchSpot.y+10);
}
UIView *hitView = [super hitTest:touchSpot withEvent:event];
if (hitView == self)
return self; // you can return nil here if you want touches to go through this view (ie transparent space in a HUD overlay or w/e)
return hitView;
}
到目前为止,这工作得很好......坐在对面的人有很好的触摸反应,就像在“家”边的玩家一样。但请注意不要在此视图之上呈现视图...一切都会通过该方法...
旧解决方案(在我发现之前 ^):
好吧,现在我的解决方案是继承uigesturerecognizer,转发任何触摸(即对识别器没有限制),然后将其添加到我的游戏视图中。然后响应任何触摸的方法仅在状态为 Ended 时运行,如果是,则继续循环遍历每个子视图(不是很多)以查看触摸是否与一个相交。同样,对于对面的玩家,它会比较稍微偏移的矩形(对于每个子视图)。
我会看看我是否能找到更有效的方法......但到目前为止还可以。
我也可以让我的游戏视图成为一个 uiview 子类并覆盖 touchesbegan/moved/ended,但我已经把它全部放置好了,所以我使用了识别器(因此不必继承 uiview)。