2016-07-14 23 views
9

Sto provando a seguire il tutorial this sulla creazione di una transizione personalizzata. Una volta che ho ottenuto un costume per la parte che coinvolge UIViewControllerAnimatedTransitioning, ho iniziato ad avere errori. . (I "m ancora nuovo per Swift, quindi c'è voluto un grande sforzo con nulla da mostrare finora)problemi nell'utilizzo di UIViewControllerAnimatedTransitioning con swift 3

continuo a ricevere 2 errori 1 -.

Impossibile assegnare valore di tipo 'CircleTransitionAnimator' digitare "CAAnimationDelegate?"

2 -

Metodo non sovrascrive alcun metodo dalla propria superclasse

Sto indovinando che il problema è legato alla 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 
} 

} 
+4

Provare ad aggiungere 'CAAnimationDelegate' come' class CircleTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning, CAAnimationDelegate'. Rimuovi 'override' da' override func animationDidStop (anim: CAAnimation !, finished flag: Bool) ' – beyowulf

risposta

17

iOS 10 mosse animationDidStart e animationDidStop a un formale CAAnimationDelegate protocollo. Come dice beyowulf, rendere la classe conforme al delegato e rimuovere il tag override dal metodo.

+0

L'ho appena fatto e l'errore è scomparso. Non conosco il motivo di basso livello su come questo cambia in iOS 10. Int iOS 9, la classe non ha bisogno di conformarsi a 'CAAnimationDelegate', e ci dovrebbe essere 'override'. –