UIViewControllerAnimatedTransitioning показывает черный экран при анимации в и из вида - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать анимацию easeInEaseOut для своих контроллеров представления, однако, когда я пытаюсь анимировать оба представления «to» и «from», представление «from» становится черным, пока анимация не закончится. Если я только анимирую представление «to», то новый контроллер представления анимирует правильно, но поверх представления «from». Я хотел бы, чтобы оба этих взгляда сошлись вместе, чтобы создать впечатление, что первое смещается, чтобы уступить место второму (я думаю, что отталкивание вторым более точно). Может кто-нибудь сказать мне, почему это будет? Я пытался поиграть с многочисленными настройками, см. Код ниже:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let toVC = transitionContext.viewController(forKey: .to), let fromVC = transitionContext.viewController(forKey: .from) else {
            dLog("No to or from VC")
            transitionContext.completeTransition(false)
            return
        }

        switch animationType {
        case .present:
            dLog("Present VC")
            transitionContext.containerView.addSubview(fromVC.view)
            transitionContext.containerView.addSubview(toVC.view)
            presentAnimation(with: transitionContext, fromView: fromVC.view, toView: toVC.view)
        case .dismiss:
            dLog("Dismiss VC")
        }
    }

    func presentAnimation(with transitionContext: UIViewControllerContextTransitioning, fromView: UIView, toView: UIView) {
        fromView.clipsToBounds = true
        toView.clipsToBounds = true
        fromView.transform = CGAffineTransform(translationX: 0, y: 0)
        toView.transform = CGAffineTransform(translationX: toView.frame.size.width, y: 0)

        let duration = transitionDuration(using: transitionContext)

        UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .curveEaseInOut, animations: {
            toView.transform = CGAffineTransform(translationX: 0.0,  y: 0.0)
            fromView.transform = CGAffineTransform(translationX: -fromView.frame.size.width, y: 0)
        }) { _ in
            transitionContext.completeTransition(true)
        }
    }

1 Ответ

0 голосов
/ 22 апреля 2020

Если кто-то еще борется с этим, я понял это. Вместо этого вы должны использовать animateKeyFrames:

UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: .calculationModeLinear, animations: {
            UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 2.0) {
                toView.transform = CGAffineTransform(translationX: 0, y: 0)
            }
            UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 2.0) {
                fromView.transform = CGAffineTransform(translationX: -fromView.frame.size.width, y: 0)
            }
        }) { _ in
            transitionContext.completeTransition(true)
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...