2016-10-06 4 views
4

Je réalise mes premières animations de segue personnalisées. Ce que je veux, c'est avoir une vue de liste qui, quand je sélectionne sur une rangée, au lieu de glisser de côté, se déploie en place à partir de la rangée sélectionnée. Quelque chose comme:Problème d'affichage de l'animation de l'animation de segue personnalisée

enter image description here

Ainsi, l'utilisateur sélectionne la ligne verte, ce qui provoque le nouveau contrôleur pour démarrer à la taille de la ligne verte et d'élargir pour remplir l'écran. Cette partie a bien fonctionné jusqu'à présent.

Le problème que j'ai est avec le segue se dérouler qui cherche à faire le contraire, rétrécir le plein écran à la ligne d'origine, puis rejeter. Ce qui se passe, c'est qu'il se rétrécit bien, mais la zone exposée reste noire, puis clignote soudainement en place lorsque l'animation est terminée. Ce qui est recherché est quelque chose comme ceci:

enter image description here

Mais ce qui se passe plus comme ceci:

enter image description here

Le code que je utilise pour perform de l'dérouleur ressemble à:

class FromScheduleFocusSegue: UIStoryboardSegue { 
    override func perform() { 
     let fromView = self.source.view! 
     let toView = self.destination.view! 
     let window = UIApplication.shared.keyWindow! 
     let schedulesList = self.destination as! SchedulesListController 
     let cell = schedulesList.tableView.cellForRow(at: schedulesList.tableView.indexPathForSelectedRow!)! 
     var stripe = cell.bounds 
     stripe.size.height = 60 
     let targetFrame = cell.convert(stripe, to: window).insetBy(dx: 0, dy: 0) 
     schedulesList.tableView.selectRow(at: nil, animated: false, scrollPosition: .none) 
     UIView.animateWithDuration(4000.milliseconds, delay: 0.seconds, options: .curveEaseInOut, animations: { 
      fromView.frame = targetFrame 
     }) { (finished) in 
      self.source.dismiss(animated: false, completion: nil) 
     } 
    } 
} 

Donc, fondamentalement, comment puis-je obtenir la vue que je suis en train de se dérouler pour apparaître comme anim ation a lieu?

Par souci d'exhaustivité, voici le code Segue avant:

class ToScheduleFocusSegue: UIStoryboardSegue { 
    override func perform() { 
     let fromView = self.source.view! 
     let toView = self.destination.view! 
     let window = UIApplication.shared.keyWindow! 
     let box = UIScreen.main.bounds 
     let schedulesList = self.source as! SchedulesListController 
     let cell = schedulesList.tableView.cellForRow(at: schedulesList.tableView.indexPathForSelectedRow!)! 
     toView.frame = cell.convert(cell.bounds, to: window).insetBy(dx: 0, dy: 0) 
     window.insertSubview(toView, aboveSubview: fromView) 
     UIView.animateWithDuration(4000.milliseconds, delay: 0.seconds, options: .curveEaseInOut, animations: { 
      toView.frame = box 
      }) { (finished) in 
       self.source.present(self.destination, animated: false, completion: nil) 
     } 
    } 
} 

(Ceci est XCode8, ciblée à iOS10 en utilisant swift3)

+0

Vous devez utiliser des transitions personnalisées à la place./UIPresentationController et famille. – Andy

+0

Si vous pouvez me montrer un exemple pour me faire aller dans la bonne direction qui fait ce que je veux visuellement, la prime est à vous. –

+0

Je regarderais plus dans UICollectionView. Par exemple, reportez-vous à la section "Animations de mise en page de la collection pour les transitions générales" ici https://www.objc.io/issues/12-animations/collectionview-animations/ –

Répondre

0

Essayez d'avoir le contrôleur de vue qui fait la présentation ne aussi le rejeter .

Donc, dans votre Segue dérouleur:

UIView.animateWithDuration(4000.milliseconds, delay: 0.seconds, options: .curveEaseInOut, animations: { 
     fromView.frame = targetFrame 
    }) { (finished) in 
     self.destination.dismiss(animated: false, completion: nil) // the destination is the one that presented the current view 
    } 
+0

Cela ne fait aucune différence. Je suis un peu surpris, je me serais attendu à ce que quelque chose soit différent, une erreur, ou une autre différence, mais le comportement visuel était le même, et rien n'était différent dans la sortie de la console. –