Pour mon projet personnel, j'essaye de faire monter l'image d'une feuille pendant 5 secondes puis de la baisser pendant 5 secondes. Cela fonctionne bien, seulement après avoir soulevé et abaissé la feuille, il change de position et est bien transporté vers le bas de l'écran. Je voudrais qu'il remonte du lieu de fin de descente. J'ai essayé plusieurs choses mais rien ne fonctionne. J'aimerais pouvoir restaurer la position d'origine après la descente, mais je pense que cela fera scintiller l'image à l'écran. Des idées ?

func upLeaf(){
        let xPosition = imageLeaf.frame.origin.x
        let yPosition = imageLeaf.frame.origin.y - 100 // Slide Up - 20px
        let width = imageLeaf.frame.size.width
        let height = imageLeaf.frame.size.height
      
        UIView.animate(withDuration: 5.0, animations: {
            self.imageLeaf.frame = CGRect(x: xPosition, y: yPosition, width: width, height: height)
        })
    }
    
    func downLeaf(){
        let xPosition = imageLeaf.frame.origin.x
        let yPosition = imageLeaf.frame.origin.y + 100 // Slide Up - 20px
        
        let width = imageLeaf.frame.size.width
        let height = imageLeaf.frame.size.height
        
        UIView.animate(withDuration: 5.0, animations: {
            self.imageLeaf.frame = CGRect(x: xPosition, y: yPosition, width: width, height: height)
        })
        secondUp = true
    }
1
MaxT49 6 oct. 2020 à 17:54

2 réponses

Meilleure réponse

Au lieu d'utiliser frame pour effectuer l'animation, vous pouvez utiliser CGAffineTransform. C'est plus puissant et tout aussi simple:

UIView.animate(withDuration: 5.0, animations: {
   line3.transform = CGAffineTransform(translationX: 0, y: 100)
})    

Lorsque vous souhaitez revenir à l'état initial, vous devez taper:

UIView.animate(withDuration: 5.0, animations: {
    line3.transform = CGAffineTransform.identity
})

CGAffineTransform se souvient des paramètres initiaux de votre vue, de sorte que vous n'ayez pas à faire de calculs vous-même.

1
andrija 6 oct. 2020 à 15:10

Si vous voulez seulement que la feuille monte et descende, vous pouvez simplement animer les frame.origin.y de imageLeaf (pas besoin de garder une trace de origin.x, width ou height).

func upDownLeaf() {
    UIView.animate(withDuration: 5.0, animations: {
            self.imageLeaf.frame.origin.y -= 100 /// go up
    }) { _ in
        UIView.animate(withDuration: 5.0, animations: {
            self.imageLeaf.frame.origin.y += 100 /// go down
        })
    }
}
1
aheze 6 oct. 2020 à 17:24