【问题标题】:Custom UINavigationController Animation Unresponsive When Finished自定义 UINavigationController 动画完成后无响应
【发布时间】:2017-06-30 21:24:02
【问题描述】:

我正在尝试为我的导航控制器转换制作幻灯片动画。例如,当我推送一个 VC 时,presenting 和 presenting 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)
  }

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

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

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

【问题讨论】:

  • 首先,您的fromView 应该已经在containerView 中,因此无需再次添加Subview。接下来,看起来您正在更改containerView 的框架...但您真的不想更改fromViewtoView(或两者)的框架inside @ 987654328@?

标签: ios swift animation uiviewcontroller uiviewanimationtransition


【解决方案1】:

好吧,我终于找到了解决方案。非常感谢@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)
    }
}

附:再次感谢@DonMag。您的见解真的很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多