2010-12-12 8 views
9

ho UIView animazioneCome arrivare origine telaio UIView e dimensioni, mentre l'animazione

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:25]; 
myview.frame = CGRectMake(218, 216, myview.frame.size.width * 0.5, myview.frame.size.height * 0.5); 
[UIView commitAnimations]; 

e NSTimer con metodo di callback. La domanda: è possibile ottenere le dimensioni myview.frame e l'origine attuali all'interno del metodo di callback del timer?
o potrebbe esserci un altro modo per rintracciarlo?

risposta

12

Sono abbastanza sicuro che non è possibile, perché quando si modifica il frame della visualizzazione ha effetto immediatamente. Sullo sfondo, Core Animation si occupa dell'animazione. Quindi, anche se potessi afferrare il fotogramma, ti darebbe le coordinate finali, non le coordinate correnti nel mezzo di un'animazione.

Accedere al livello di presentazione della proprietà, come indicato da NWCoder nei commenti. Vedi lo documentation.

[view.layer.presentationLayer frame] 
+0

sì, ho notato (circa immediatamente). ok, cercherò un altro modo ... – heximal

+9

Se qualcuno ha ancora bisogno di questo, è possibile. Puoi usare: [[v.layer presentationLayer] frame]; – NWCoder

+0

@NWCoder: Heh, figo! Non sapevo che era possibile. –

1

La cornice della vista non viene aggiornata durante l'animazione, come hai capito. Si potrebbe provare myview.layer.frame (solo una supposizione, anche se ho il sospetto che non funzionerà neanche).

+0

In realtà, myview.layer.frame ha funzionato bene per me, come suggerito sopra da Brian. –

3

NWCoder ha ragione. Ti darò un esempio in C# dato che codice in MonoTouch.

RectangleF start = new RectangleF(0,0,100,100); 
    RectangleF end = new RectangleF(100,100,100,100); 
    UIView yourView = new UIView(start); 

    UIView.Animate (120d, 0d, UIViewAnimationOptions.CurveLinear, delegate { 
    yourView.Frame = end; 
    }, delegate { }); 

Il blocco di codice in alto sposta yourView da 0,0 a 100,100 in 120 secondi. Nel momento in cui inizia l'animazione, yourView.Frame è già impostato su (100,100,100,100) ... quindi yourView.Frame.X sarà uguale a 100 per l'intero 120 secondi.

D'altra parte, se si utilizza la prima riga sotto qualsiasi momento durante i 120 secondi ...

float currentX = yourView.Layer.PresentationLayer.Frame.X 
    float currentProp = yourView.Layer.PresentationLayer.Frame.<any other frame property> 

... si è in affari. Otterrai le proprietà del fotogramma live durante l'animazione.

Funziona alla grande. Lo sto usando nella mia app ora.

+0

@sudo mi ha votato ... perché l'ho votato ... non perché la mia risposta non era corretta. Piuttosto infantile. La risposta di sudo era sbagliata e meritava un voto negativo. –

+0

Siamo spiacenti, è appena successo di vedere il tuo commento. Non ho minimamente minimizzato la tua risposta. Per favore non dare per scontato cose su altre persone del genere. –

+0

Non ho dovuto assumere nulla. Hai aggiornato il tuo post nel momento in cui la mia risposta ha ottenuto un voto negativo. Coincidenza? Dubbioso. –

Problemi correlati