【发布时间】:2015-12-20 15:07:26
【问题描述】:
我遇到了一个奇怪的错误。我只是使用UIViewControllerTransitioningDelegate 的iOS 自定义转换方法UIViewControllers 以及UIViewControllerAnimatedTransitioning 的实现。一切似乎都很好,直到我完全执行以下操作:
- 打开应用程序
- 使用我的自定义过渡呈现另一个视图控制器
- 横向旋转
- 关闭刚刚呈现的视图控制器
就是这样!现在发生的情况如下:我在初始视图控制器的右侧看到一个大黑条(好像该控制器的视图没有旋转到横向)。
有趣的是,这只会在 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