私は、それぞれのUIViewのdrawRect:メソッドを使用して描画した幾分複雑な図形を持ついくつかのUIViewを持っています。私はパスへの参照を(CGPathプロパティを介して)保存しています。タッチを実際にパスまたはシェイプ(CGPathContainsPoint)内にあるかどうかを検出するために、タッチメソッドで使用しています。シェイプのため、透明のビューの領域があります(ビューのbackgroundColorプロパティがclearColorまたはそのようなものに設定されていると仮定すると、四角形/長方形以外のものは明らかに透明領域を持ちます)。UITouchがどのビューにバインドされるかを決めることはできますか?
ビューの上端または上端が重なる状況では、タッチメソッド(touchesBeganなど)で実際にタッチがCGPathまたはシェイプ内にあるかどうかをテストしています。タッチがシェイプ内にない場合は、タッチをその次のビューに転送して、それが順番にその要件を満たしているかどうかを確認します。
しかし、悲しいことに(と私の悲惨さに)、これは実際にビューにバインドされているタッチと同じように動作しません。私は特にこの問題を除いて、あらゆる面でこの問題を解決しました。各ビューはUIRotationGestureRecognizerを使用しています。しかし、タッチが別のビューの透過領域から始まり、そのビューがそのタッチをその下のビューに転送する場合、UIGestureRecognizerは決してトリガーされません。
私はどのように知っているすべての角度からこれを見てきました。実際にタッチを適切なビューに再割り当てまたはバインドする方法を考えようとしましたが、これが可能かどうかはわかりません。ビューが別のビューにタッチを単に転送している限り、タッチは最初にタッチを受け取った元のビューにバインドされたままです。
UIApplicationやUIWindowをサブクラス化してsendEvent: "メソッドをオーバーライドすることで、このようなことができるのだろうかと思いますが、Appleがこれであなたに与える可能性のあるコントロールは正確ではありません。プライベートAPIにアクセスしている可能性があります。私は実際には、タッチがそれに属していると見なすようにタッチを再割り当てする必要があります。
アイデア?
を使用して、それからUIBezierPathを作成することができますCGPathにとして格納されている場合は、右のトラックに私を置きます。それをもう少し調べると、私はこのブログ投稿が完全に質問に答えたことを発見しました:http://bynomial.com/blog/?p=74それは良い努力だったので私は答えを受け入れ、私が知る必要があった。 – daveMac
明確にできるものはありますか? –
各ビューはtouchesメソッド(touchesBegan、movedなど)をオーバーライドしてタッチを「インターセプト」しているため、 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)イベントは、ビュー。しかし、上で提供したリンクをたどって、基になるサブビューのhitTest:メソッドをオーバーライドしてから、pointInside:を使用して、それが有効な接触かどうかを判断することができました。また、あなたは「パス内部のポイント?」とうまくいっていると確信していますが私がすでにこれをやっていると述べたので、それは無関係でした。もう一度ありがとう – daveMac