使用swift 3使用UIViewControllerAnimatedTransitioning时遇到问题

时间:2016-07-14 01:21:05

标签: swift swift-protocols

我正在尝试关注构建自定义转换的this教程。一旦我得到了涉及UIViewControllerAnimatedTransitioning的部件的自定义,我就开始出错了。 (我现在还很新,所以到目前为止,它还没有付出很多努力。)

我不断收到2个错误。 1 -

  

无法指定类型' CircleTransitionAnimator'的值输入' CAAnimationDelegate?'

2 -

  

Method不会覆盖其超类

中的任何方法

我猜这个问题与UIViewControllerAnimatedTransitioning有关

class CircleTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning {

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

weak var transitionContext: UIViewControllerContextTransitioning?

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

    self.transitionContext = transitionContext

    var containerView = transitionContext.containerView()
    var fromViewController = transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey) as! ViewController
    var toViewController = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey) as! ViewController
    var button = fromViewController.button

    containerView.addSubview(toViewController.view)

    var circleMaskPathInitial = UIBezierPath(ovalIn: (button?.frame)!)
    var extremePoint = CGPoint(x: (button?.center.x)! - 0, y: (button?.center.y)! - toViewController.view.bounds.height)
    var radius = sqrt((extremePoint.x*extremePoint.x) + (extremePoint.y*extremePoint.y))
    var circleMaskPathFinal = UIBezierPath(ovalIn: (button?.frame)!.insetBy(dx: -radius, dy: -radius))

    var maskLayer = CAShapeLayer()
    maskLayer.path = circleMaskPathFinal.cgPath
    toViewController.view.layer.mask = maskLayer

    var maskLayerAnimation = CABasicAnimation(keyPath: "path")
    maskLayerAnimation.fromValue = circleMaskPathInitial.cgPath
    maskLayerAnimation.toValue = circleMaskPathFinal.cgPath
    maskLayerAnimation.duration = self.transitionDuration(using: transitionContext)
    maskLayerAnimation.delegate = self
    maskLayer.add(maskLayerAnimation, forKey: "path")


}

override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
    self.transitionContext?.completeTransition(!self.transitionContext!.transitionWasCancelled())
    self.transitionContext?.viewController(forKey: UITransitionContextFromViewControllerKey)?.view.layer.mask = nil
}

}

1 个答案:

答案 0 :(得分:17)

iOS 10将animationDidStartanimationDidStop移至正式CAAnimationDelegate协议。就像beyowulf所说的那样,让类符合委托并从方法中删除override标记。