解包viewForKey(UITransitionContextFromViewKey)时的Nil(Swift)

Kex*_*Kex 9 uiview swift

我正在尝试自定义过渡动画.我创建了一个符合以下条件的动画对象UIViewControllerAnimatedTransitioning:

import UIKit

class ViewControllerAnimator: NSObject, UIViewControllerAnimatedTransitioning {

    let duration = 1.0

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

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!

        //Animate out
        UIView.animateWithDuration(duration, animations: { () -> Void in
            fromView.frame.origin.x -= 200
            }) { (Bool) -> Void in
                transitionContext.completeTransition(true)

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

我试图设置框架时出错fromView.它试图强行解开零时崩溃.我在这做错了什么?为什么我的fromView没有?

Kex*_*Kex 20

如果其他人遇到此问题,请找到答案.我有myViewController.modalPresentationStyle = .Custom.出于某种原因,这似乎是一个错误,并导致它崩溃.设置时,也无法从容器视图中正确删除fromView控制器transitionContext.completeTransition(true).只需删除自定义演示文稿样式行即可.

  • 这实际上是一个快速的错误.如果您将代码翻译为ObjC,它甚至可以使用.Custom演示文稿样式.:-( (3认同)
  • 好的(足够的)解决方法是“ let fromView = transitionContext.viewController(forKey:.from)!. view!”,因为有时您需要设置“ modalPresentationStyle”,例如显示当前上下文的视图 (2认同)
  • @SuperDuperTango 这个错误在 iOS 12 中仍然存在。 (2认同)

小智 9

这是预期的行为:

如果-shouldRemovePresentersView返回NO,则在演示期间与UITransitionContextFromViewKey关联的视图为nil。这是为了暗示您的动画师不应操纵呈现视图控制器的视图。对于解雇,将返回-presentedView。

https://developer.apple.com/library/content/samplecode/CustomTransitions/Listings/CustomTransitions_Custom_Presentation_AAPLCustomPresentationController_m.html