0

次のコードは、画面の上部から形状の画像のアニメーションを生成し、コア アニメーションを使用して下方にドリフトします。ユーザーがタップすると、ユーザーが画像 (形状) をタップしたかどうか、または形状を見逃して背景に触れたかどうかがログに記録されます。これはうまくいくようです。しかし、他の形状の画像を追加するとどうなりますか? このコードに基づいて、より詳細な情報を記録できるようにする方法についての提案を探しています。

三角形の UIImage、正方形の UIImage、および円の UIImage をプログラムで追加したいとします。3 つの画像すべてが上から下に流れ始めます。移行するときに、それらが重なり合うことさえあります。「マスに触れた!」をログに記録できるようにしたい。または私が触れた適切な形は何でも。四角形が三角形と円の間に配置されていても、四角形の一部が表示されているのでタップできるようにしたいです。(この例は、最上位レイヤーとやり取りしたいだけではないことを示しています)

このコードを微調整して、さまざまな UIImages (おそらくさまざまな形状の画像) をプログラムで追加し、どの形状に触れているかをログに記録できるようにするにはどうすればよいですか?

- (void)viewDidLoad
 {
 [super viewDidLoad];

 CGPoint endPoint = CGPointMake([[self view] bounds].size.width, 
                             [[self view] bounds].size.height);
 CABasicAnimation *animation = [CABasicAnimation 
                                    animationWithKeyPath:@"position"];
 animation.fromValue = [NSValue valueWithCGPoint:[[_imageView layer] position]];
 animation.toValue = [NSValue valueWithCGPoint:endPoint];
 animation.duration = 30.0f;
 [[_imageView layer] addAnimation:animation forKey:@"position"];

 }



 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
 UITouch *t = [touches anyObject];
 CGPoint thePoint = [t locationInView:self.view];

   thePoint = [[_imageView layer] convertPoint:thePoint toLayer:[[self view] layer]];

      if([[_imageView layer].presentationLayer hitTest:thePoint])
         {
             NSLog(@"You touched a Shape!");
             // for now I'm just logging this information.  Eventually I want to have the shape follow my figure as I move it to a new location.  I want everything else to continue animating but I when I touch a particular shape I want to have complete control on repositioning that specific shape.  That's just some insight beyond the scope of this question.  However feel free to comment about this if you have suggestions.  

         }
         else{
             NSLog(@"backgound touched");
         }

   }

これに対する答えは、さまざまなサブビューをループすることに関係があるのではないかと考えています。-touchesBegan メソッドを変更する可能性があると考えている方法を見てください。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *t = [t anyObject];
    CGPoint thePoint = [t locationInView:self.view];
    for (UIView *myView in viewArray) {
        if (CGRectContainsPoint(myView.frame, thePoint)) {....

ここで、viewArray を設定し、すべてのサブビューを viewArray に配置したことに注意してください。これは私が使用すべきものですか?または、レイヤーをループする場合は、おそらく次のようなものです。

 for(CALayer *mylayer in self.view.layer.sublayers)

ビューやレイヤーをどれだけループしようとしても、これを機能させることができないようです。明らかな何かが欠けているような気がします...

4

1 に答える 1

0

犯人は の座標系を変える行だと思いますthePoint。おそらくconvertPoint:fromLayer:、その行の実行前に読む必要があります。あなたのポイントはself.viewの座標系にあり、imaveViewの座標系にあることを望んでいると思います。または、その行を完全にスキップして、[t locationInView:_imageView]代わりに電話をかけることもできます。

于 2013-05-02T19:12:46.477 に答える