2016-07-14 75 views
9

Tôi đang cố gắng theo dõi this hướng dẫn về cách tạo chuyển đổi tùy chỉnh. Một khi tôi đã đến một tùy chỉnh cho một phần có liên quan đến UIViewControllerAnimatedTransitioning, tôi bắt đầu có lỗi. . (I "m vẫn còn mới để nhanh chóng, vì vậy nó được thực hiện rất nhiều công sức mà không có gì để hiển thị cho đến nay)gặp sự cố khi sử dụng UIViewControllerAnimatedTransitioning với swift 3

tôi tiếp tục nhận được 2 lỗi 1 -.

Không thể gán giá trị của loại 'CircleTransitionAnimator' để nhập 'CAAnimationDelegate?'

2 -

Phương pháp không ghi đè lên bất kỳ phương pháp từ lớp cha

mình Tôi đoán rằng vấn đề này có liên quan đến 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

Thử thêm 'CAAnimationDelegate' như' lớp CircleTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning, CAAnimationDelegate'. Xóa 'override' khỏi' override func animationDidStop (anim: CAAnimation !, xong cờ: Bool) ' – beyowulf

Trả lời

17

iOS 10 di chuyển animationDidStartanimationDidStop đến trang chính thức CAAnimationDelegate giao thức. Giống như beyowulf nói, làm cho lớp phù hợp với đại biểu và loại bỏ các thẻ override từ phương pháp.

+0

Tôi chỉ làm điều này, và lỗi biến mất. Tôi không biết lý do cấp thấp về cách thay đổi này trong iOS 10. Int iOS 9, lớp không cần phải tuân theo 'CAAnimationDelegate', và nên có 'override'. –

Các vấn đề liên quan