Пользовательский push-переход не работает, тогда как такой же пользовательский переход присутствует

Я следовал этому руководству и смотрел видео WWDC на эту тему, но не смог найти ответ.

У меня почти такой же переход в моем коде. Это работает довольно хорошо, когда я делаю это как представленное представление, но не как выдвигаемое представление.

Предполагается, что анимированный снимок выдвинутого представления из CGRect на весь экран и наоборот, когда выскочил.

Вот код моего UIViewControllerAnimatedTransitioning учебный класс:

class ZoomingTransitionController: NSObject, UIViewControllerAnimatedTransitioning {

    let originFrame: CGRect
    let isDismissing: Bool

    init(originFrame: CGRect, isDismissing: Bool) {
        self.originFrame = originFrame
        self.isDismissing = isDismissing
    }

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return Constant.Animation.VeryShort
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let containerView = transitionContext.containerView

        guard let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from),
            let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) else {
                return
        }

        let finalFrame = transitionContext.finalFrame(for: toVC)

        toVC.view.frame = finalFrame

        let snapshot = self.isDismissing ? fromVC.view.snapshotView(afterScreenUpdates: true) : toVC.view.snapshotView(afterScreenUpdates: true)
        snapshot?.frame = self.isDismissing ? finalFrame : self.originFrame
        snapshot?.layer.cornerRadius = Constant.FakeButton.CornerRadius
        snapshot?.layer.masksToBounds = true

        containerView.addSubview(toVC.view)
        containerView.addSubview(snapshot!)

        if self.isDismissing {
            fromVC.view.isHidden = true
        } else {
            toVC.view.isHidden = true
        }

        let duration = transitionDuration(using: transitionContext)

        UIView.animate(withDuration: duration,
                       animations: {
            snapshot?.frame = self.isDismissing ? self.originFrame : finalFrame
            },
                       completion: { _ in
                        if self.isDismissing {
                            fromVC.view.isHidden = false
                        } else {
                            toVC.view.isHidden = false
                        }

                        snapshot?.removeFromSuperview()
                        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        })
    }
}

Затем я попытался показать новый View Controller, используя два способа: представив его и нажав его.

мой FromViewController подклассы обоих UINavigationControllerDelegate а также UIViewControllerTransitioningDelegate,

FromViewController класс, представляющий ToViewController (который отлично работает):

func buttonAction(_ sender: AnyObject) {
    self.tappedButtonFrame = sender.frame

    let toVC = self.storyboard!.instantiateViewController(withIdentifier: "ToViewController")
    toVC.transitioningDelegate = self

    self.present(toVC, animated: true, completion: nil)
}

func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    let transitionController = ZoomingTransitionController(originFrame: self.tappedButtonFrame, isDismissing: false)

    return transitionController
}

func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    let transitionController = ZoomingTransitionController(originFrame: self.tappedButtonFrame, isDismissing: true)

    return transitionController
}

FromViewController класс толкает ToViewController (который не работает):

func buttonAction(_ sender: AnyObject) {
    self.tappedButtonFrame = sender.frame

    let toVC = self.storyboard!.instantiateViewController(withIdentifier: "ToViewController")

    self.navigationController?.pushViewController(toVC, animated: true)
}

func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    switch operation {
    case .push:
        return ZoomingTransitionController(originFrame: self.tappedButtonFrame, isDismissing: false)

    case .pop:
        return ZoomingTransitionController(originFrame: self.tappedButtonFrame, isDismissing: true)

    default:
        return nil
    }
}

При нажатии вызывается метод делегата, и ZoomingTransitionController выполняет свой код нормально (происходит в animateTransition до конца без заметной проблемы). Но на экране вид моментального снимка не отображается в любой момент. ToVC появляется после продолжительности перехода, но пока ничего не происходит.

У меня заканчиваются идеи о том, как это отладить... У вас есть идеи?

Спасибо!!

1 ответ

Решение

Я нашел свой ответ, заменив элемент снимка (который вызывал проблему) на CGAffineTransform из toVC,

Код почти такой же, как здесь.

Другие вопросы по тегам