【问题标题】:Custom UIViewController transition bug in iOS 9iOS 9 中的自定义 UIViewController 转换错误
【发布时间】:2015-12-20 15:07:26
【问题描述】:

我遇到了一个奇怪的错误。我只是使用UIViewControllerTransitioningDelegate 的iOS 自定义转换方法UIViewControllers 以及UIViewControllerAnimatedTransitioning 的实现。一切似乎都很好,直到我完全执行以下操作:

  1. 打开应用程序
  2. 使用我的自定义过渡呈现另一个视图控制器
  3. 横向旋转
  4. 关闭刚刚呈现的视图控制器

就是这样!现在发生的情况如下:我在初始视图控制器的右侧看到一个大黑条(好像该控制器的视图没有旋转到横向)。

有趣的是,这只会在 iOS 9 中出错,而在 iOS 8 中,一切似乎都运行良好。我不知道的自定义转换 API 有什么变化吗?或者这只是一个非常讨厌的 iOS 9 错误?如果有人可以告诉我我做错了什么,或者如果有人可以为我提供解决方法,我将不胜感激!

这些类重现了问题:

import UIKit
class ViewController: UIViewController, UIViewControllerTransitioningDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tap")
        view.addGestureRecognizer(tapGestureRecognizer)
    }

    func tap() {
        let controller = ModalViewController()
        controller.transitioningDelegate = self
        presentViewController(controller, animated: true, completion: nil)
    }

    func animationControllerForPresentedController(presented: UIViewController,
                                                   presentingController presenting: UIViewController,
                                                   sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return Transitioning()
    }

    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return Transitioning()
    }
}

呈现的视图控制器:

import UIKit
class ModalViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.redColor()

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tap")
        view.addGestureRecognizer(tapGestureRecognizer)
    }

    func tap() {
        dismissViewControllerAnimated(true, completion: nil)
    }
}

最后是UIViewControllerAnimatedTransitioning 实现:

import UIKit
class Transitioning: NSObject, UIViewControllerAnimatedTransitioning {

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.5
    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)
        let toView = transitionContext.viewForKey(UITransitionContextToViewKey)
        let containerView = transitionContext.containerView()
        if let fromView = fromView, toView = toView {
            containerView?.addSubview(fromView)
            containerView?.addSubview(toView)

            toView.alpha = 0
            UIView.animateWithDuration(0.5, animations: {
                toView.alpha = 1
            }, completion: {
                finished in
                transitionContext.completeTransition(true)
            })
        }
    }
}

【问题讨论】:

  • 我又玩了一些,我找到了一个“修复”,但这当然是一个肮脏的解决方法。如果我在动画开始之前添加这一行:toView.frame = UIApplication.sharedApplication().windows[0].bounds 问题就消失了。所以我从中得到的线索是:主 ViewController 的框架在旋转 ModalViewController 后没有更新。太奇怪了。
  • 投反对票的人能否解释一下我可以做些什么来使这个问题变得更好?我有点困惑为什么它被否决了。
  • 就个人而言,我一般使用toView.frame = fromView.frame,但您的方法可能适合您的需求。仅供参考,您不必将fromView 添加到层次结构中,因为它已经存在。重新投票,我不知道,因为这似乎是一个合理的问题......我没有搜索,但也许以前有人问过这个问题。不过,我同意,当人们不说出他们为什么投反对票时,这很烦人。
  • 非常感谢罗伯!这是一个更好的解决方案,而且您不必将 fromView 添加到容器中是完全正确的。你能把你的答案写成一个实际的答案,以便我接受吗?
  • 你评论的问题好像已经在这里splinter.com.au/2015/04/17/…报告了。

标签: ios uiviewcontroller transitions


【解决方案1】:

我一般在animateTransition中使用如下:

toView.frame = fromView.frame

仅供参考,您不必将fromView 添加到层次结构中,因为它已经存在。

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多