自定义 UINavigationController 动画完成后无响应

Custom UINavigationController Animation Unresponsive When Finished

我正在尝试为我的导航控制器转换制作幻灯片动画。例如,当我按下 VC 时,呈现和呈现的 VC 将像 UIPageViewController 转换一样转换。

这是我目前编写的代码:

guard let fromView = transitionContext.view(forKey: .from),
      let toView = transitionContext.view(forKey: .to)
  else { return }

  let containerView = transitionContext.containerView

  toView.frame = CGRect(x: -toViewFrameHorizationtalPosition,
                        y: 64,
                        width: UIScreen.main.bounds.width,
                        height: UIScreen.main.bounds.height)

  containerView.addSubview(fromView)
  containerView.addSubview(toView)

  UIView.animate(withDuration: transitionDuration(using: transitionContext),
                 delay: 0,
                 options: .curveEaseInOut,
                 animations: {
                   containerView.frame.origin.x = self.toViewFrameHorizationtalPosition
  }) { completed in
    transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
  }

过渡动画如我所料发生,但即使经过各种尝试,一旦动画执行,视图就会变得无响应;它不识别任何触摸事件。

导航栏工作正常,但当我切换回初始视图时,该视图也没有响应。

虽然我似乎无法发现问题,但我已经阅读了很多这方面的内容并且已经为此苦苦挣扎了一段时间。有什么想法吗?

那好吧,我终于找到了解决办法。非常感谢@DonMag 用他的精彩评论为我指明了正确的方向!

首先,正如@DonMag 也提到的,我不需要将 fromView 添加到 containerView 中,因为它已经存在于其中。

无论如何,呈现的视图 toView 没有响应的问题是为了制作幻灯片动画:

  • 我正在更改 toViews 框架原点的 x 值以将其定位在容器视图中,
  • 并通过更改其框架原点的 x 值再次移动容器视图。我正在移动容器视图,因为我希望 fromViewtoView 一个接一个地执行,即就像 UIPageViewController 的动画效果一样。

问题是我没有将它们设置回原来的值。一旦我将 toViews 和 containerViews 帧原点设置回动画完成块中的原始值,一切都按预期工作。

修改后的动画代码如下:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard let toView = transitionContext.view(forKey: .to)
        else { return }

    toView.removeFromSuperview()
    toView.frame = CGRect(x: -toViewFrameHorizationtalPosition,
                          y: 64,
                          width: UIScreen.main.bounds.width,
                          height: UIScreen.main.bounds.height)

    let containerView = transitionContext.containerView
    containerView.addSubview(toView)

    UIView.animate(withDuration: transitionDuration(using: transitionContext),
                   delay: 0,
                   options: .curveEaseInOut,
                   animations: {
                                    containerView.frame.origin.x = self.toViewFrameHorizationtalPosition
    }) { completed in
        containerView.frame.origin.x = 0
        toView.frame.origin.x = 0
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }
}

P.S。再次感谢@DonMag。您的见解真的很有帮助。