6
votes

Rotation UIView avec CGAFFINETRANSFORME - Comment le faire aller plein chemin et pas court?

Je fais une application de compteur de vitesse et je veux que la flèche se comporte de la bonne voie - si je le lance de zéro à 200 km en une seconde, je veux que cela se déplace dans la barre, mais si je fixais mon angle de rotation assez grand , ça va à court terme, du bas.
Comment puis-je le faire aller au cercle presque complet et non via un chemin court?

Voici le code (trivial) que j'utilise pour rotation: xxx

i graphique je peux faire pivoter Dans de petits morceaux, mais il peut parfois être nécessaire de le faire pivoter rapidement de zéro au maximum (par exemple, si nous n'avions pas de lecture à la vitesse et que je l'ai déjà à grande vitesse, nous devons donc faire pivoter la flèche la plus grande de l'écran). < / p>

comme une question secondaire - comment puis-je filer des animations, afin que je puisse les appliquer un par un?


0 commentaires

3 Réponses :


3
votes

J'ai eu un problème similaire dans le dos. Je n'avais que 180 degrés, mais parfois j'en avais besoin dans le sens des aiguilles d'une montre, parfois dans le sens des aiguilles d'une montre, mais j'ai toujours retourné entre les deux, d'où la propriété "tournée" dans le code.

Vous devez utiliser Calayer. et de gâteyframeinimations, et voici le code qui a fonctionné pour moi: xxx


0 commentaires

4
votes

J'ai fait une fonction d'assistance pour cela un peu de temps en arrière qui est inclus ci-dessous. Fondamentalement, Uikit est inutile pour cela, vous devrez importer le framework quartzcore et utiliser CakeyFrameinimation Code> comme @Paul CEZANNE a souligné, ou Cabasicanimation code>, lequel je pense manipulera C'est très bien.

L'utilisation est assez simple, appelez simplement la méthode décrite ci-dessous en passant la vue d'image que vous souhaitez faire pivoter, la rotation que vous souhaitez dans les radians et la durée d'animation et votre vue d'image vous animeront correctement. Cela prendra toujours le "long chemin" car il y a en fait une direction spécifiée ici. P>

Si vous passez des valeurs positives à l'animation, elle tournera dans le sens des aiguilles d'une montre, puis naturellement, des valeurs négatives provoqueront une rotation dans le sens anti-horaire. P>

[self rotateView:imageView rotationInRadians:M_PI duration:2.0];


- (void)rotateView:(UIImageView *)imageView rotationInRadians:(CGFloat)radians duration:(CFTimeInterval)duration
{
    CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

    [rotationAnimation setToValue:[NSNumber numberWithFloat:radians]];
    [rotationAnimation setDuration:duration];
    [rotationAnimation setCumulative:YES];
    [rotationAnimation setFillMode:kCAFillModeForwards];
    [rotationAnimation setRemovedOnCompletion:NO];

    [imageView.layer addAnimation:rotationAnimation forKey:@"gaugeRotationAnimation"];
}


0 commentaires

1
votes

SWIFT 3 strong>

J'avais exactement le même problème, voici ma solution au cas où elle aide toute autre personne. p>

Référencez le calque contenant le pointeur: p> xxx pré>

Définissez une variable pour garder une trace de la dernière position du pointeur: P>

func rotatePointer(imageView: UIImageView, rotationInRadians: CGFloat, duration: CFTimeInterval) {

    let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")

    rotationAnimation.fromValue = meterPointerRadians
    rotationAnimation.toValue = rotationInRadians
    rotationAnimation.duration = duration
    rotationAnimation.isCumulative = true
    rotationAnimation.fillMode = kCAFillModeBoth
    rotationAnimation.isRemovedOnCompletion = false

    imageView.layer.add(rotationAnimation, forKey: "pointerRotationAnimation")
    meterPointerRadians = CGFloat(rotationInRadians)

}


0 commentaires