Я использовал следующий метод в своем пользовательском классе Animator для перехода, когда пользователь выбирает imageView в ячейке tableViewController в виде фокуса, показывающем увеличенное изображение. ImageView хорошо анимируется из своего кадра в tableView на весь экран, а затем обратно, когда я его отклоняю.
Это работало нормально до iOS 13. Но теперь, когда я использую этот анимированный переход на модально представленном tableViewController, анимация к представлению фокуса работает нормально, но когда я отклоняю представление фокуса, чтобы оживить обратно к tableViewController,tableViewController больше не существует. Это просто показывает неактивный viewController, который находился под модально представленным tableViewController. Я знаю, что новый стиль по умолчанию для modalPresentation - pageSheet, но не уверен, почему исчезает контроллер верхнего вида перед анимацией?
Анимация все еще отлично работает для viewControllers, которые не представлены модально.
Интересно, если это ошибка или кто-то нашел решение?
Вот моя функция animateTransition:
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
// define variable to keep track of whether transitioning from or to
var presentingImage = false
// define containerView
let containerView = transitionContext.containerView
// get view controllers
let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
// set the destination view controllers frame
toVC.view.frame = fromVC.view.frame
// create transition imageView
let imageView = UIImageView(image: image)
imageView.contentMode = .scaleAspectFill
imageView.frame = (fromDelegate == nil) ? CGRect() : fromDelegate!.imageWindowFrame()
imageView.clipsToBounds = true
// add imageView to containerView
containerView.addSubview(imageView)
// create from screen snapshot
fromDelegate!.transitionSetup(presentingImage: presentingImage)
toDelegate!.transitionSetup(presentingImage: presentingImage)
let fromSnapshot = fromVC.view.snapshotView(afterScreenUpdates: true)!
fromSnapshot.frame = fromVC.view.frame
containerView.addSubview(fromSnapshot)
// create to screen snapshot
let toSnapshot = toVC.view.snapshotView(afterScreenUpdates: true)!
toSnapshot.frame = fromVC.view.frame
containerView.addSubview(toSnapshot)
toSnapshot.alpha = 0
// bring the image view to the front and get the final frame
containerView.bringSubviewToFront(imageView)
let toFrame = (self.toDelegate == nil) ? CGRect() : self.toDelegate!.imageWindowFrame()
// animate change
UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.8, options: .curveEaseOut, animations: {
// set toSnapshot alpha to 1
toSnapshot.alpha = 1
// set imageView frame to toFrame
imageView.frame = toFrame
}, completion:{ (finished) in
// call transition cleanup for to and from delegate
self.toDelegate!.transitionCleanup(presentingImage: presentingImage)
self.fromDelegate!.transitionCleanup(presentingImage: presentingImage)
// remove transition views
imageView.removeFromSuperview()
fromSnapshot.removeFromSuperview()
toSnapshot.removeFromSuperview()
// complete transition
if !transitionContext.transitionWasCancelled {
containerView.addSubview(toVC.view)
}
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
})
}