2010-12-12 34 views
9

je animation UIViewComment obtenir origine cadre UIView et la taille tandis que l'animation

[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]; 

et NSTimer avec la méthode de rappel. La question: est-il possible d'obtenir la taille et l'origine actuelles de myview.frame dans la méthode de rappel par minuterie?
ou peut-il y avoir une autre façon de le tracer?

Répondre

12

Je suis assez sûr que ce n'est pas possible, parce que lorsque vous modifiez le frame de votre vue, il prend effet immédiatement. En arrière-plan, Core Animation s'occupe de l'animation. Donc, même si vous pouviez saisir le cadre, il vous donnerait les coordonnées finales, pas les coordonnées actuelles au milieu d'une animation.

Accédez à la couche de présentation de la propriété, comme indiqué par NWCoder dans les commentaires. Voir le documentation.

[view.layer.presentationLayer frame] 
+0

oui, j'ai remarqué (à propos immédiatement). ok, va chercher une autre façon ... – heximal

+9

Si quelqu'un a encore besoin de cela, c'est possible. Vous pouvez utiliser: [[v.layer presentationLayer] frame]; – NWCoder

+0

@NWCoder: Heh, cool! Je ne savais pas que c'était possible. –

1

Le cadre de la vue n'est pas mis à jour pendant l'animation, comme vous l'avez compris. Vous pouvez essayer myview.layer.frame (juste une supposition, bien que je soupçonne que cela ne fonctionnera pas non plus).

+0

En fait, myview.layer.frame a bien fonctionné pour moi, comme suggéré ci-dessus par Brian. –

3

NWCoder a raison. Je vais vous donner un exemple en C# depuis que je code dans 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 { }); 

Le bloc de code ci-dessus déplace yourView de 0,0 à 100,100 en 120 secondes. Au démarrage de l'animation, votreFichier.View est déjà défini sur (100,100,100,100) ... donc votreFichier.Frame.X sera égal à 100 pour l'ensemble des 120 secondes.

D'autre part, si vous utilisez la première ligne ci-dessous en tout temps pendant les 120 secondes ...

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

... vous êtes dans les affaires. Vous obtiendrez les propriétés du cadre en direct pendant l'animation.

Fonctionne très bien. Je l'utilise dans mon application maintenant.

+0

@sudo m'a rejeté ... parce que je l'ai rejeté ... pas parce que ma réponse était incorrecte. Plutôt puéril. La réponse de sudo était incorrecte et méritait un vote négatif. –

+0

Désolé, il est juste arrivé de voir votre commentaire. Je n'ai pas du tout déprimé votre réponse. S'il vous plaît ne supposez pas les choses sur d'autres personnes comme ça. –

+0

Je n'avais rien à assumer. Vous avez mis à jour votre message dès la minute où ma réponse a été rejetée. Coïncidence? Douteux. –