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
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:
Mais ce qui se passe plus comme ceci:
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)
Vous devez utiliser des transitions personnalisées à la place./UIPresentationController et famille. – Andy
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. –
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/ –