@romanwb

Как отобразить snapshot в NavigationController с кастомной AnimateTransition?

Мне нужно показать снимок вьюшки во время анимации, но когда я запускаю этот код, получается черный (прозрачный) экран. Снимок добавлен в containerView, выставлены корректные фреймы, isHidden = false, opaque = true.
В отладчике слоев экрана экран на переднем плане, но черный (прозрачный).
В containerView subviews он один присудствует:

[<_UIReplicantView: 0x7ff1f34138a0; frame = (0 0; 375 667); layer = <_UIReplicantLayer: 0x600000bb57a0>>] Properties: Opaque On Hidden Off


В прозрачном NavigationBar виден розовый цвет, значит слой есть, но конкретно в части отображения экрана - не отображается.

ps Эта проблема только в NavigationController, с обычным контроллером все работает как ожидается.

fpMkX.gif
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard let fromVC = transitionContext.viewController(forKey: .from),
        let fromView = fromVC.view,
        let toVC = transitionContext.viewController(forKey: .to),
        let toView = toVC.view
        else {
            return
    }

    let containerView = transitionContext.containerView

    // If remove this, toSnapshot trasparent (but in attributes alpha=1 transparent=0 opaque=false)
    fromView.removeFromSuperview()

    let toSnapshot = toView.snapshotView(afterScreenUpdates: true)!
    containerView.addSubview(toSnapshot)

    // Pritingig 
    print(containerView.subviews)

    //transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
  • Вопрос задан
  • 265 просмотров
Пригласить эксперта
Ответы на вопрос 1
doublench21
@doublench21 Куратор тега Swift
Что-то мне подсказывает, что Вы совершенно не понимаете логику переходов между VC и ГЛАВНОЕ в каком контексте это происходит.

Во-первых: Что за Магическая необходимость заставила вас удалять вью контроллера из которого вы переходите - неясно... А как вы перейдете назад? В никуда.

Во-вторых: Предоставляете ли вы свой класс анимации, тут Важно, не Контроллеру, к которому переходите, а Навигейшн Контроллеру? Что-то мне подсказывает, нет.

В-третьих: Вот полностью рабочий вариант. (Рабочий в том смысле, что он делает то, что вы хотите. Опущены проверки)

5c70127785756462005262.png
.
Код текстом
internal final class ModalAnimator: NSObject, UIViewControllerAnimatedTransitioning {

  private var isPresenting: Bool

  private let duration: TimeInterval = 3

  internal init(isPresenting: Bool) {
    self.isPresenting = isPresenting
  }

  internal func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
    return duration
  }

  internal func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard let fromVC = transitionContext.viewController(forKey: .from),
      let toVC = transitionContext.viewController(forKey: .to),
      let snapshot = toVC.view.snapshotView(afterScreenUpdates: true)
      else { return }

    let containerView = transitionContext.containerView

    snapshot.frame = fromVC.view.frame

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

    fromVC.view.isHidden = true

    UIView.animate(
      withDuration: duration,
      animations: { snapshot.transform = CGAffineTransform(rotationAngle: .pi)},
      completion: { _ in
        fromVC.view.isHidden = false
        snapshot.removeFromSuperview()
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    })
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы