2017-06-26 4 views
0

J'ai un UILabel que j'essaye de mettre à l'échelle et de traduire, et je veux animer ceci. Je fais ceci en mettant son transform dans un bloc UIView.animate. Lorsque l'animation est terminée, je voudrais redéfinir le transform de la vue sur .identity et mettre à jour son cadre afin qu'il reste exactement là où le CGAffineTransform l'a déplacé. Pseudocode:Comment animer la mise à l'échelle et déplacer un UILabel, puis remettre sa transformation à l'identité lorsque vous avez terminé et conserver son cadre?

func animateMovement(label: UILabel, 
        newWidth: CGFloat, 
        newHeight: CGFloat, 
        newOriginX: CGFloat, 
        newOriginY: CGFloat) 
{   
    UIView.animate(withDuration: duration, animations: { 
     label.transform = ??? // Something that moves it to the new location and new size 
    }) { 
     label.frame = ??? // The final frame from the above animation 
     label.transform = CGAffineTransform.identity 
    } 
} 

Quant à savoir pourquoi je ne cède pas simplement le nouveau cadre dans le bloc d'animation: J'ai du texte dans l'étiquette que je veux à l'échelle de l'animation, ce qui est impossible lors de l'animation de changer le cadre au lieu de la transformation.

Je rencontre des problèmes d'espace de coordonnées, ce que je peux dire parce que, après l'animation, il n'est pas dans l'emplacement correct (l'étiquette n'a pas la bonne origine).

Répondre

2

Voici la réponse que j'ai trouvée. Cela met à l'échelle le contenu pendant la durée de l'animation, puis réinitialise l'objet pour que l'identité se transforme lorsque vous avez terminé.

static func changeFrame(label: UILabel, 
         toOriginX newOriginX: CGFloat, 
         toOriginY newOriginY: CGFloat, 
         toWidth newWidth: CGFloat, 
         toHeight newHeight: CGFloat, 
         duration: TimeInterval) 
{ 
    let oldFrame = label.frame 
    let newFrame = CGRect(x: newOriginX, y: newOriginY, width: newWidth, height: newHeight) 

    let translation = CGAffineTransform(translationX: newFrame.midX - oldFrame.midX, 
             y: newFrame.midY - oldFrame.midY) 
    let scaling = CGAffineTransform(scaleX: newFrame.width/oldFrame.width, 
            y: newFrame.height/oldFrame.height) 

    let transform = scaling.concatenating(translation) 

    UIView.animate(withDuration: duration, animations: { 
     label.transform = transform 
    }) { _ in 
     label.transform = .identity 
     label.frame = newFrame 
    } 
} 
+0

bon travail !; félicitations –