2013-01-07 12 views
8

Sto tentando di creare una vista immagine (logo in basso) verso l'alto di 100 pixel verso l'alto. Sto usando questo codice, ma non succede niente affatto:Animazione di una vista immagine per scorrere verso l'alto

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:3]; 
logo.center = CGPointMake(logo.center.x, logo.center.y - 100); 
[UIView commitAnimations]; 

Questo codice è nel metodo viewDidLoad. In particolare, lo logo.center = ... non funziona. Altre cose (come cambiare l'alfa) fanno. Forse non sto usando il codice giusto per farlo scorrere verso l'alto?

+0

Nel metodo viewDidLoad. Mi dispiace per quello! –

+1

Stai usando l'autolayout? – Rob

+0

Concordato con Rob, dal codice fornito nel tuo esempio questo sembra essere un problema con il layout automatico che intralcia la tua animazione. Se utilizzi il layout automatico, dovrai animare i vincoli invece di impostare esplicitamente il fotogramma. –

risposta

42

Per i non-layout automatico storyboard/ONA, il codice va bene. Tra l'altro, è ormai generalmente consigliato che si animano con blocks:

[UIView animateWithDuration:3.0 
       animations:^{ 
        self.logo.center = CGPointMake(self.logo.center.x, self.logo.center.y - 100.0); 
       }]; 

Oppure, se si vuole un po 'più di controllo sulle opzioni e simili, è possibile utilizzare:

[UIView animateWithDuration:3.0 
         delay:0.0 
        options:UIViewAnimationCurveEaseInOut 
       animations:^{ 
        self.logo.center = CGPointMake(self.logo.center.x, self.logo.center.y - 100); 
       } 
       completion:nil]; 

Ma il codice dovrebbe funzionare se non stai usando l'autolayout. È solo che la sintassi sopra è preferibile per iOS 4 e versioni successive.

Se stai usando layout automatico, è (a) creare un IBOutlet per il vincolo di spazio verticale (vedi sotto), e poi (b) si può fare qualcosa di simile:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    static BOOL logoAlreadyMoved = NO; // or have an instance variable 

    if (!logoAlreadyMoved) 
    { 
     logoAlreadyMoved = YES; // set this first, in case this method is called again 

     self.imageVerticalSpaceConstraint.constant -= 100.0; 
     [UIView animateWithDuration:3.0 animations:^{ 
      [self.view layoutIfNeeded]; 
     }]; 
    } 
} 

Per aggiungere un IBOutlet per un vincolo, basta controllo -Trascinare dal vincolo al vostro .h nel assistente al montaggio:

add IBOutlet for vertical constraint

a proposito, se si sta animando un vincolo, b È sensibile a qualsiasi altro vincolo che potresti aver collegato a tale visualizzazione. Spesso se metti qualcosa proprio sotto l'immagine, avrà il suo vincolo legato all'immagine, quindi dovresti assicurarti di non avere altri controlli con vincoli all'immagine (a meno che tu non voglia che anche loro si spostino) .

Si può dire se si sta utilizzando layout automatico aprendo lo storyboard o NIB e quindi selezionando il file "commissario" (la prima scheda a destra più pannelli, oppure si può tirare premendo opzione + comando + (il numero "1")):

autolayout on

ricordate, se la pianificazione sul sostegno pre-iOS 6, assicurarsi di spegnere "autolayout". L'Autolayout è una funzionalità di iOS 6 e non funzionerà con le versioni precedenti di iOS.

+0

L'uso di una costante di -50 sposterà la vista dalla parte superiore dello schermo. Quello che vuoi è il valore costante originale meno 50. – rdelmar

+0

@rdelmar Giusto.Presumevo che lo stesse spostando dallo schermo, ma chiaramente avrebbe dovuto cambiare la costante per essere quello che avrebbe dovuto essere. Ho ottimizzato il codice in base. – Rob

+0

Sai perché, se lo fai con un pulsante, il titolo si anima dall'esterno del pulsante nella sua posizione corretta? L'ho notato prima in alcuni dei miei esperimenti di animazione, e non ha senso per me - presumo che qualsiasi vincolo per il titolo sia interno al pulsante stesso, e non dovrebbe cambiare. – rdelmar

-1

hanno u provare

logo.frame = CGRectMake(logo.frame.origin.x, logo.frame.origin.y - 100,logo.frame.size.width,logo.frame.size.height) 
Problemi correlati