3

ルートレイヤーと2つのCALayerサブクラスで構成される構造があります。これらの2つのレイヤーにもレイヤーが含まれています。

ここにスキームがあります:

ROOT LAYER 
    |
    |------- LAYER A
    |           |---------BG
    |
    |
    |--------LAYER B
                |---------BG

hitTestその上でメソッドを呼び出すとROOT LAYER、最も内側のレイヤーが階層に返されます。したがって、ユーザーがクリックするLAYER Aと、のBGが表示されますLAYER A

//In this example hitResult will contains the BG of LAYER A or the BG of LAYER B
CALayer *hitResult = [rootLayer hitTest:point)]; 

LAYER Aレスポンダーチェーンを停止して、直接またはLAYER Bに送信されたHitTestから取得するにはどうすればよいROOT LAYERですか?

4

2 に答える 2

6

これらのレイヤーが独自のCALayerサブクラスである場合は、そこでオーバーライドするか、独自のロジックを実行できhitTest:ますcontainsPoint:

バックグラウンドレイヤーをオーバーライドcontainsPoint:して返すと、スーパーレイヤーの実装NOから戻されなくなります。hitTest:

hitTest:または、レイヤーAとレイヤーBでオーバーライドしselfて、ポイントが含まれている場合は戻ることができます。

于 2013-02-19T12:46:21.467 に答える
0

念のために言っておきますが、ヌルのzスケールを設定すると、レイヤーはヒットテストに合格しなくなります。

// BG layer won't receive clicks
bgLayer.transform = CATransform3DMakeScale(1, 1, 0)

これは、サブクラス化せずにレイヤーを非アクティブにする方法ですが、Appleはいつでもこの動作を自由に変更できると思うので、お勧めしません。

とにかく、サブレイヤーがクリックされなくなった理由を疑問に思う人のために、この回答を削除します。どのスケーリングでも、szで1を渡すようにしてください。

私はこのトリッキーなもので数時間を失いました。

于 2020-10-17T16:27:29.690 に答える