transitions animées

jean-lucjean-luc Membre
mars 2017 modifié dans API UIKit #1

Bonjour,


j'essaie de travailler les UIViewAnimationOptions.


J'ai crée le code suivant en créant 3 Views nommées container, view1 et view2.


La première transition fonctionne, mais la seconde me donne le message d'erreur:


"fatal error: unexpectedly found nil while unwrapping an Optional value


(lldb)"


 


si quelqu'un peut m'orienter ? Merci



class ViewController: UIViewController {

@IBOutlet weak var container: UIView!
@IBOutlet weak var view2: UIView!
@IBOutlet weak var view1: UIView!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

@IBAction func goTransitionAction(_ sender: UIButton) {
transitionCurlUp21()
}

@IBAction func goTransitionActionBis(_ sender: UIButton) {
transitionCurlUp12()
}


func transitionCurlUp21() {
var views21 : (frontView: UIView, backView: UIView)
views21 = (frontView: self.view2, backView: self.view1)
let transitionOptions = UIViewAnimationOptions.transitionCurlUp
UIView.transition(from: views21.frontView, to: views21.backView, duration: 3.0, options: transitionOptions, completion: nil)
}

func transitionCurlUp12() {
var views12 : (frontView: UIView, backView: UIView)
views12 = (frontView: self.view1, backView: self.view2)
let transitionOptions = UIViewAnimationOptions.transitionCurlUp
UIView.transition(from: views12.frontView, to: views12.backView, duration: 3.0, options: transitionOptions, completion: nil)
}


}

Réponses

  • Cette erreur signifie que tu tentes d'utiliser un objet vide (contenant nil). Est-ce que view1 et view2 sont correctement initialisé ?


     


    Pourquoi utiliser des tupples ? Cela complique ton code pour pas grand chose.

  • En fait, j'essaie de comprendre.


    Peux-tu m'orienter vers un exemple ?


  • Si je comprend bien, tu as une view container sur l'écran, et tu veux alternativement changer son contenu par celui de view1 et de view2. C'est bien ça ?

  • jean-lucjean-luc Membre
    mars 2017 modifié #5

    oui c'est bien çà .


    J'ai simplifié le code (surtout supprimer les "weak"


    Je peux alterner le changement de vues.


    Il reste qu'après 2 transitions, mes vues ne sont plus centrées dans la vue container   :)



    @IBOutlet var container: UIView!
    @IBOutlet var view2: UIView!
    @IBOutlet var view1: UIView!
    var front: Bool = true

    override func viewDidLoad() {
    super.viewDidLoad()
    }

    @IBAction func goAction(_ sender: UIButton) {
    if (front) {
    UIView.transition(from: self.view2, to: self.view1, duration: 2, options: UIViewAnimationOptions.transitionCurlUp, completion: nil)
    } else {
    UIView.transition(from: self.view1, to: self.view2, duration: 2, options: UIViewAnimationOptions.transitionCurlDown , completion: nil)
    }
    front = !front

    }

  • Par contre il est préférable d'utiliser les balises de code...

  • DrakenDraken Membre
    mars 2017 modifié #7

    Cela fonctionne très bien en plein écran, avec deux vues s'affichant successivement sur la vue principale. J'ai pris une durée de 0.2 secondes, la valeur initiale de 2 étant interminable a s'exécuter. 


     


    Il suffit de toucher l'écran (événement touchesBegan() ) pour déclencher la transition. 


    a



    class ViewController: UIViewController {

    private let view1 = UIView()
    private let view2 = UIView()

    private var front = true

    override func viewDidLoad() {
    super.viewDidLoad()

    view1.frame = self.view.frame
    view1.backgroundColor = UIColor.green
    self.view.addSubview(view1)

    view2.frame = self.view.frame
    view2.backgroundColor = UIColor.red

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if front {
    UIView.transition(from: view1,
    to: view2,
    duration: 0.2,
    options: UIViewAnimationOptions.transitionCurlUp,
    completion: nil)
    } else {
    UIView.transition(from: view2,
    to: view1,
    duration: 0.2,
    options: UIViewAnimationOptions.transitionCurlDown,
    completion: nil)
    }
    front = !front
    }

    }


  • DrakenDraken Membre
    mars 2017 modifié #8

    La même chose, s'affichant dans une vue Container située au centre de l'écran :



    class ViewController: UIViewController {

    private let container = UIView()
    private let view1 = UIView()
    private let view2 = UIView()

    private var front = true

    override func viewDidLoad() {
    super.viewDidLoad()

    let rect = CGRect(x: 0, y: 0, width: 300, height: 300)
    container.frame = rect
    container.backgroundColor = UIColor.blue
    // On place le Container sur la vue principale
    self.view.addSubview(container)
    // Centrage du container sur l'écran
    container.center = self.view.center

    // Les vues internes doivent avoir la même taille
    // que le Container, et commencer à  la position (0,0)
    let rectInterne = CGRect(origin: CGPoint.zero, size: container.frame.size)

    // Création view1
    view1.frame = rectInterne
    view1.backgroundColor = UIColor.green
    // On place view1 dans le Container
    container.addSubview(view1)

    // Création view2
    // Elle n'est attachée à  aucune vue
    // au démarrage
    view2.frame = rectInterne
    view2.backgroundColor = UIColor.red

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // print ("touchesBegan")
    if front {
    UIView.transition(from: view1,
    to: view2,
    duration: 0.2,
    options: UIViewAnimationOptions.transitionCurlUp,
    completion: nil)
    } else {
    UIView.transition(from: view2,
    to: view1,
    duration: 0.2,
    options: UIViewAnimationOptions.transitionCurlDown,
    completion: nil)
    }
    front = !front
    }

    }


  • Merci pour ta réponse,


    je suppose qu'il me faudra programmer la conception de ma vue directement en code ?


  • Je fais tout en code, parce que c'est plus naturel pour moi. Il y a certainement moyen de faire la même chose avec Storyboard. 


  • Merci pour cette réponse.


    Ce qui m'amène à  demander si on peux récupérer le code d'un paramètrage d'une vue avec storyBoard ?


Connectez-vous ou Inscrivez-vous pour répondre.