まず、SO の他の場所からCALayerへのこの非常に便利な拡張機能を確認してください。レイヤーのコンテンツに割り当てられたCGImageRefのポイントが透明か透明でないかを判断するのに役立ちます。
注意: レイヤがCGImageRefcontents
であるかのように表現可能または応答するという保証はありません。(これは、上記で参照されている拡張機能の広範な使用に影響を与える可能性があります。) ただし、私の場合、テストしているレイヤーにはCGImageRefが割り当てられていることがわかっています。(うまくいけば、これは配属後も私の下から変わることはありません! さらに、それが保持されていることに気付きました。)contents
contents
さて、当面の問題に戻りましょう。拡張機能の使用方法は次のとおりです。まず、セレクターを からcontainsPoint:
に変更しましたcontainsNonTransparentPoint:
(元のメソッドを維持する必要があります)。
これで、 7 つのCALayerオブジェクトを使用するUIImageViewサブクラスができました。これらは、不透明度ベースのアニメーション (パルス/グロー効果およびオン/オフ状態) に使用されます。これらの 7 つのレイヤーのそれぞれに既知のCGImageRefがあり、ビュー全体の一部を独自の色帯で効果的に「カバー」(エア クォート) します。それぞれのレイヤー内の各画像の残りの部分は透明です。contents
サブクラスでは、シングル タップ ジェスチャを登録します。1 つが到着すると、レイヤーを調べて、効果的にタップされたレイヤー (つまり、タップした場所が不透明なポイントがあり、最初に見つかったレイヤーが勝つ) を確認してから、必要なことを何でも実行できます。
ジェスチャを処理する方法は次のとおりです。
- (IBAction)handleSingleTap:(UIGestureRecognizer *)sender {
CGPoint tapPoint = [sender locationInView:sender.view];
// Flip y so 0,0 is at lower left. (Required by layer method below.)
tapPoint.y = sender.view.bounds.size.height - tapPoint.y;
// Figure out which layer was effectively tapped. First match wins.
for (CALayer *layer in myLayers) {
if ([layer containsNonTransparentPoint:tapPoint]) {
NSLog(@"%@ tapped at (%.0f, %.0f)", layer.name, tapPoint.x, tapPoint.y);
// We got our layer! Do something useful with it.
return;
}
}
}
良いニュース?これらはすべて、iOS 4.3.2 の iPhone シミュレーターで美しく動作します。(FWIW、私は Xcode 4.1 を実行している Lion を使用しています。)
しかし、私の iPhone 4 (iOS 4.3.3 を搭載したもの) では、それにさえ近づきません! 私のタップはどれも、私が期待するレイヤーのいずれとも一致しないようです。
1x1 ピクセル コンテキストに描画するときにCGContextSetBlendModeを使用するという提案を試みても、さいころはありません。
パイロットのエラーだといいのですが、何が違うのかはまだわかりません。タップにはパターンがありますが、識別できるものではありません。
おそらく、データ境界の問題があります。おそらく、y座標を画像の左下に反転する以外のことをしなければなりません。まだわかりません。
誰かが間違っている可能性があることに光を当てることができれば、私は最も感謝しています!
更新、2011 年 9 月 22 日:最初のあははの瞬間を獲得しました! 問題は Simulator-vs-iPhone ではありません。網膜対非網膜です!Retina 版を使用している場合、シミュレーターで同じ症状が発生します。おそらく、ソリューションは何らかの方法/形状/形式でのスケーリング (CTM?) を中心にしています。Quartz 2D Programming Guide は、「iOS アプリケーションはUIGraphicsBeginImageContextWithOptionsを使用する必要がある」ともアドバイスしています。私はここで解決策に非常に近いと感じています!