3

いくつかのCALayerサブクラスを含むUIViewがあります。次のコードを使用して、タッチイベントが対応するレイヤーを検出しています。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
NSLog(@"%@,%@",NSStringFromCGPoint(point),[self.layer hitTest:point].name);


}

これは、デバイスが回転するまで正常に機能します。デバイスを回転させると、現在のすべてのレイヤーがスーパーレイヤーから削除され、新しい方向に合うように新しいCALayerが作成されます。新しいレイヤーは正しく挿入され、正しい方向で表示できます。

ローテーション後、hitTestメソッドは常にレイヤーに対してnullを返します。180度回転すると、返されるレイヤーが回転前のその位置にあることに気付きました。つまり、左上のレイヤーに触れると、180度回転すると右下のレイヤーになります。ヒットテストの座標は、(0,0)が左上にある状態で期待どおりに印刷されます。回転するたびにレイヤーを再描画しますが、何らかの理由で、ホームボタンが下部にある「正しい」方法にマッピングされているようです。ローテーションを処理した後、関数呼び出しなどがありませんか?

乾杯、アダム

4

1 に答える 1

4

さて、私は次のコードが問題なくすべての方向で機能することを発見しました(私の場合、重複するビューがないので、これは私に適しています):

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *t = [touches anyObject];

    CGPoint point = [t locationInView:self];

    for(CALayer *layer in self.layer.sublayers) {

        CGPoint convertedPoint = [self.layer convertPoint:point
                                                  toLayer:layer];

        if([layer containsPoint:convertedPointPoint]) {
            NSLog(@"%@",layer.name);
        }
    }
}

この手動のポイント変換は正しく機能しますが、元のメソッド呼び出しが機能しなかった理由については疑問が残ります。誰かが私を啓発できますか?

アダム

于 2010-04-05T13:23:38.343 に答える