2012-08-24 60 views
1

我在viewDidAppear下面iphone編程:一個UIImageView的碰撞檢測和動畫

-(void)viewDidAppear:(BOOL)animated 
{ 
    for (int i = 0; i < 100; i++) { 

     p = arc4random_uniform(320)%4+1; //global integer 

     CGRect startFrame = CGRectMake(p*50, -50, 50, 50); 
     CGRect endFrame = CGRectMake(p*50, CGRectGetHeight(self.view.bounds) + 50, 
             50, 
             50); 

     animatedView = [[UIView alloc] initWithFrame:startFrame]; 
     animatedView.backgroundColor = [UIColor redColor]; 

     [self.view addSubview:animatedView]; 

     [UIView animateWithDuration:2.f 
           delay:i * 0.5f 
          options:UIViewAnimationCurveLinear 
         animations:^{ 
          animatedView.frame = endFrame; 
         } completion:^(BOOL finished) { 
          [animatedView removeFromSuperview]; 
         }]; 
    } 
} 

它簡單地從屏幕和移動到下的頂部產生小方塊所示的動畫。 我還有一個UIImageView,它由x軸上的加速度計控制。目標不是觸及動畫對象。像一個簡單的比賽遊戲。然而,我無法找到如何檢測imageView和動畫之間的碰撞?

回答

5

首先,您需要將所有動畫視圖對象保存在數組中以檢查與圖像視圖的碰撞。所以在您的.h文件中創建一個NSArray持有的動畫意見

NSMutableArray animatedViews; 

然後在viewDidLoad中初始化

animatedViews = [[NSMutableArray alloc] init]; 

然後改變你的代碼viewWillAppear中,並添加一行

[self.view addSubview:animatedView]; 
[animatedViews addObject:animatedView]; 

然後創建一個函數來檢查碰撞,它需要一個預定的計時器參數

-(void) checkCollision: (NSTimer *) theTimer{ 
    for(int i = 0; i < [animatedViews count]; i++) { 
     UIView *theView = [animatedViews objectAtIndex:index]; 
     if (CGRectIntersectsRect(theView.frame, yourImageView.frame) { 
      // the image collided 
      // stop the timer and do your work here 
     } 
    } 
} 

然後在viewWillAppear中添加此行安排定時調用後,每半秒調用函數來檢查碰撞

[NSTimer scheduledTimerWithTimeInterval: 0.5 
          target: self 
          selector: @selector(checkCollision:) 
          userInfo: nil 
          repeats: YES]; 
+0

感謝您的解決方案。我確實如你所說。我認爲這很有意義。但是,沒有什麼改變。我仍然無法捕捉到碰撞。 – death7eater

+0

你有什麼想法? – death7eater

+0

oops我錯誤地寫了'5.0'(五)秒的時間間隔,你是不是改了它在0.5秒之後運行了半秒。 –

3

的問題是在這個測試:if (CGRectIntersectsRect(theView.frame, yourImageView.frame) 你必須檢查的表示層查看:

CGRect movingFrame = [[theImage.layer presentationLayer] frame]; 
    if (CGRectIntersectsRect(movingFrame, panier.frame)) {   
     // the image collided    
    }