編集: Omg君たち私はついに方法を見つけました!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をサブクラス化し、任意のタッチを転送して(つまり、レコグナイザーに制約がない)、それをゲームのビューに追加することです。次に、タッチに応答するメソッドは、状態が終了したときにのみ実行され、終了した場合は、すべてのサブビュー(多くはない)をループして、タッチが1つと交差したかどうかを確認します。同様に、反対側のプレーヤーの場合、(サブビューごとに)少しオフセットされたrectを比較します。
もっと効率的な方法を見つけることができるかどうかを確認します...しかし、これまでのところ大丈夫です。
ゲームビューをuiviewサブクラスにして、オーバーライドされたタッチを開始/移動/終了することもできましたが、すでにすべて配置されていたので、レコグナイザーを使用しました(したがって、uiviewをサブクラス化する必要はありません)。