animateTransition больше не работает с модально представленным viewController в iOS 13 - PullRequest
1 голос
/ 05 октября 2019

Я использовал следующий метод в своем пользовательском классе 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)
    })
}
...