2011-10-02 8 views
23

Sto cercando di trovare la posizione corrente di un iPhone ImageView che si sta animando sullo schermo.Accesso alla posizione corrente di UIView durante l'animazione

creo e animare l'ImageView in questo modo

-(IBAction)button:(UIButton *)sender{ 
    UIImageView *myImageView =[[UIImageView alloc] initWithImage: 
            [UIImage imageNamed:@"ball.png"]];  
    myImageView.frame = CGRectMake(0, self.view.frame.size.height/2, 40, 40);  
    [self.view addSubview:myImageView]; 
    [myArray addObject:myImageView]; 

    [UIView animateWithDuration:.5 
          delay:0 
       options:(UIViewAnimationOptionAllowUserInteraction) // | something here?) 
        animations:^{ 
         myImageView.frame = CGRectOffset(myImageView.frame, 500, 0);  
        } 
        completion:^(BOOL finished){ 
         [myArray removeObject:myImageView]; 
         [myImageView removeFromSuperview]; 
         [myImageView release]; 
        } 
    ]; 
} 

quindi per rilevare la corrente CGPoint del ImageView io chiamo questo metodo ogni 60 ° di secondo

-(void)findPoint{ 

    for (UIImageView *projectile in bullets) {   
     label.text = [NSString stringWithFormat:@"%f", projectile.center.x]; 
     label2.text = [NSString stringWithFormat:@"%f", projectile.center.y]; 
    } 
} 

Tuttavia questo dà solo a me la punto in cui termina l'animazione, voglio ottenere il CGPoint corrente dell'immagine che si sta animando sullo schermo. C'è un'opzione che ho bisogno di applicare diverso da UIViewAnimationOptionAllowUserInteraction per fare questo? In caso contrario, come ottengo la posizione corrente di un'immagine animata?

risposta

44

È possibile utilizzare PresentationLayer, una proprietà del CALayer che "fornisce una stretta approssimazione alla versione del livello attualmente visualizzato". Basta usare in questo modo:

CGRect projectileFrame = [[projectile.layer presentationLayer] frame]; 
+0

Grazie !! questo funziona perfettamente, a parte un avviso che non viene trovato il metodo '-presentationLayer'. Devo importare un framework? – user975134

+0

ottenuto #import grazie ancora !! – user975134

+0

perfettamente in grado di accettare la risposta? :-) Sì, ho dimenticato di menzionare che dovresti collegare QuartzCore.framework e aggiungere un'importazione #import , come faresti ogni volta che ti occupi di CALayers. – adamsiton

-1

Molto più facile da impostare un KVO per view.frame, come indicato nel this answer. È possibile ispezionare il nuovo valore per ottenere il nuovo frame come CGRect.

+1

Purtroppo non sembra funzionare Ho provato con '[view.layer addObserver: self forKeyPath: @" frame "opzioni: NSKeyValueObservingOptionNew context: NULL];' e '[visualizza addObserver: self forKeyPath: @" layer. frame "options: NSKeyValueObservingOptionNew context: NULL];' – jrmgx