2012-05-11 6 views
0

私は、それぞれのUIViewのdrawRect:メソッドを使用して描画した幾分複雑な図形を持ついくつかのUIViewを持っています。私はパスへの参照を(CGPathプロパティを介して)保存しています。タッチを実際にパスまたはシェイプ(CGPathContainsPoint)内にあるかどうかを検出するために、タッチメソッドで使用しています。シェイプのため、透明のビューの領域があります(ビューのbackgroundColorプロパティがclearColorまたはそのようなものに設定されていると仮定すると、四角形/長方形以外のものは明らかに透明領域を持ちます)。UITouchがどのビューにバインドされるかを決めることはできますか?

ビューの上端または上端が重なる状況では、タッチメソッド(touchesBeganなど)で実際にタッチがCGPathまたはシェイプ内にあるかどうかをテストしています。タッチがシェイプ内にない場合は、タッチをその次のビューに転送して、それが順番にその要件を満たしているかどうかを確認します。

しかし、悲しいことに(と私の悲惨さに)、これは実際にビューにバインドされているタッチと同じように動作しません。私は特にこの問題を除いて、あらゆる面でこの問題を解決しました。各ビューはUIRotationGestureRecognizerを使用しています。しかし、タッチが別のビューの透過領域から始まり、そのビューがそのタッチをその下のビューに転送する場合、UIGestureRecognizerは決してトリガーされません。

私はどのように知っているすべての角度からこれを見てきました。実際にタッチを適切なビューに再割り当てまたはバインドする方法を考えようとしましたが、これが可能かどうかはわかりません。ビューが別のビューにタッチを単に転送している限り、タッチは最初にタッチを受け取った元のビューにバインドされたままです。

UIApplicationやUIWindowをサブクラス化してsendEvent: "メソッドをオーバーライドすることで、このようなことができるのだろうかと思いますが、Appleがこれであなたに与える可能性のあるコントロールは正確ではありません。プライベートAPIにアクセスしている可能性があります。私は実際には、タッチがそれに属していると見なすようにタッチを再割り当てする必要があります。

アイデア?

答えて

2

あなたはサブクラスのUIViewまたはサブクラスUIGestureRecognizerいずれかによってこれを行うことができます。

サブクラスUIViewの

のUIView(またはそのサブクラスのいずれか)をサブクラス化し、

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 

をオーバーライドすることによって、あなたはどのような点を決めることができますあなたの視野の中にあるとみなされます。パスの外にある点については、単に返します。NO

サブクラスUIGestureRecognizer

UIGestureRecognizer(またはそのサブクラスのいずれか)をサブクラス化して、ジェスチャー認識は認識すべきである触れるかを決めることができ

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

をオーバーライドすること。パス外のすべてのタッチのためにあなた自身の

- (void)ignoreTouch:(UITouch *)touch forEvent:(UIEvent *)event 

を呼び出す(ただしサブクラスではない)必要があります。


パス内のポイント?

いずれの場合でも、ポイントが保存したパスの内側にあるかどうかを知る必要があります。パスはすでにUIBezierPath sと保存されている場合は

あなたは単にベジェパス上

- (BOOL)containsPoint:(CGPoint)point 

を呼び出すことができます。ポイントまたはタッチは、あなたのビューで

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view 

または

- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view 

を呼び出すことにより、パスと同じビューの座標に変換する必要があります。

パスが、これは完全に質問に答えていませんでしたが、あなたが

[UIBezierPath bezierPathWithCGPath:CGPath]; 
+0

を使用して、それからUIBezierPathを作成することができますCGPathにとして格納されている場合は、右のトラックに私を置きます。それをもう少し調べると、私はこのブログ投稿が完全に質問に答えたことを発見しました:http://bynomial.com/blog/?p=74それは良い努力だったので私は答えを受け入れ、私が知る必要があった。 – daveMac

+0

明確にできるものはありますか? –

+0

各ビューはtouchesメソッド(touchesBegan、movedなど)をオーバーライドしてタッチを「インターセプト」しているため、 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)イベントは、ビュー。しかし、上で提供したリンクをたどって、基になるサブビューのhitTest:メソッドをオーバーライドしてから、pointInside:を使用して、それが有効な接触かどうかを判断することができました。また、あなたは「パス内部のポイント?」とうまくいっていると確信していますが私がすでにこれをやっていると述べたので、それは無関係でした。もう一度ありがとう – daveMac

関連する問題