6

私はCocoaTouchアプリケーションに取り組んでおり、ビューのレイヤーのどのサブレイヤーがタッチされたかを判別することでタッチを処理しようとしていました。私のコントローラーのコードは次のようになりました。

CALayer *hitLayer = [self.view.layer hitTest:point];

これは機能していませんでした。サブレイヤーの下部をタップすると機能しますが、上部はタップしません。1時間のヘアプルとグーグルの後で、レイヤー自体の代わりにプレゼンテーションレイヤーを使用してヒットテストを実行すると、それが機能することがようやくわかりました。

CALayer *hitLayer = [self.view.layer.presentationLayer hitTest:point];

だから、私は私の問題を解決しました、しかし私の質問は:なぜですか?

Core Animationガイドを読みましたが、プレゼンテーションツリーとレンダリングツリーはオブジェクトモデルツリーとは異なる場合があることを理解しています。しかし、プレゼンテーションツリーが(明らかに)異なるヒットテスト動作をする理由がわかりません。プレゼンテーションツリーとオブジェクトモデルは同じフレームや境界などを持っていませんか?

4

2 に答える 2

4

CALayerのドキュメントによると、ユーザーに表示される内容に関して、モデルとプレゼンテーションツリーの間に違いがあるようです(進行中のアニメーションによって異なります)。ヒットテストについては、presentationLayerメソッドに参照があります。

たとえば、hitTest:メッセージをpresentationLayerに送信すると、レイヤーツリーのプレゼンテーション値が照会されます。

したがって、ヒットテストを実行するための適切なジオメトリ情報を持っているのはプレゼンテーション層だけだと思います。

于 2010-02-04T16:10:26.103 に答える
3

クリストファー、私も非常によく似た問題を抱えていました。ただし、ポイントをスーパーレイヤーまたはスーパービュー座標系に変換すると、完全に機能しました。プレゼンテーション層は使用しませんでした。

    //Identify the touch point in the view. Using UITapRecognizer
CGPoint loc = [recognizer locationInView:recognizer.view];

//convert the point to superview co-ordinates and then identify the layer using hit test.
CALayer *layer = [self.layer hitTest:[self convertPoint:loc toView:self.superview]];

これにより、少なくとも今のところ、触れられたレイヤーが返されます。これが間違ったアプローチであり、代わりにプレゼンテーション層を使用する必要があると思われる場合は、お知らせください。

于 2011-09-02T18:34:55.543 に答える