2017-01-01 63 views
0
class CircularTransition: NSObject { 

    var circle = UIView() 

    var startingPoint = CGPoint.zero { 
     didSet { 
      circle.center = startingPoint 
     } 
    } 

    var circleColor = UIColor.whiteColor() 

    var duration = 0.3 

    enum CircularTransitionMode:Int { 
     case present, dismiss, pop 
    } 

    var transitionMode:CircularTransitionMode = .present 

} 

extension CircularTransition:UIViewControllerAnimatedTransitioning { 

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

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
     let containerView = transitionContext.containerView 

     if transitionMode == .present { 
      if let presentedView = transitionContext.viewForKey(UITransitionContextToViewControllerKey) { 
       let viewCenter = presentedView.center 
       let viewSize = presentedView.frame.size 

       circle = UIView() 

       circle.frame = frameForCircle(withViewCenter: viewCenter, size: viewSize, startPoint: startingPoint) 

       circle.layer.cornerRadius = circle.frame.size.height/2 
       circle.center = startingPoint 
       circle.backgroundColor = circleColor 
       circle.transform = CGAffineTransformMakeScale(0.001, 0.001) 
       containerView()!.addSubview(circle) 


       presentedView.center = startingPoint 
       presentedView.transform = CGAffineTransformMakeScale(0.001, 0.001) 
       presentedView.alpha = 0 
       containerView()!.addSubview(presentedView) 

       UIView.animateWithDuration(duration, animations: { 
        self.circle.transform = CGAffineTransformIdentity 
        presentedView.transform = CGAffineTransformIdentity 
        presentedView.alpha = 1 
        presentedView.center = viewCenter 

        }, completion: { (success:Bool) in 
         transitionContext.completeTransition(success) 
       }) 
      } 

     } else { 
      let transitionModeKey = (transitionMode == .pop) ? UITransitionContextToViewKey : UITransitionContextFromViewKey 

      if let returningView = transitionContext.viewForKey(transitionModeKey) { 
       let viewCenter = returningView.center 
       let viewSize = returningView.frame.size 


       circle.frame = frameForCircle(withViewCenter: viewCenter, size: viewSize, startPoint: startingPoint) 

       circle.layer.cornerRadius = circle.frame.size.height/2 
       circle.center = startingPoint 

       UIView.animateWithDuration(duration, animations: { 
        self.circle.transform = CGAffineTransformMakeScale(0.001, 0.001) 
        returningView.transform = CGAffineTransformMakeScale(0.001, 0.001) 
        returningView.center = self.startingPoint 
        returningView.alpha = 0 

        if self.transitionMode == .pop { 
         containerView()!.insertSubview(returningView, belowSubview: returningView) 
         containerView()!.insertSubview(self.circle, belowSubview: returningView) 
        } 


        }, completion: { (success:Bool) in 
         returningView.center = viewCenter 
         returningView.removeFromSuperview() 

         self.circle.removeFromSuperview() 

         transitionContext.completeTransition(success) 

       }) 

      } 


     } 

    } 

    func frameForCircle (withViewCenter viewCenter:CGPoint, size viewSize:CGSize, startPoint:CGPoint) -> CGRect { 
     let xLength = fmax(startPoint.x, viewSize.width - startPoint.x) 
     let yLength = fmax(startPoint.y, viewSize.height - startPoint.y) 

     let offestVector = sqrt(xLength * xLength + yLength * yLength) * 2 
     let size = CGSize(width: offestVector, height: offestVector) 

     return CGRect(origin: CGPoint.zero, size: size) 

    } 

} 

enter image description here 錯誤: 「類型 'CircularTransition' 不符合協議 'UIViewControllerAnimatedTransitioning'」斯威夫特 - 類型 'CircularTransition' 不符合協議 'UIViewControllerAnimatedTransitioning'

我試圖按照YouTube的教程(鏈接波紋),問題是他正在使用Swift 3,但我不是。

中房:https://www.youtube.com/watch?v=B9sH_VxPPo4

這裏是在視頻中使用的代碼。

整個代碼,但在迅疾3:https://github.com/brianadvent/CircularTransition/tree/master/CircularTransitionft

回答

1

我解決它。

我簡單地更換以下,

func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { 

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

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 

func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 
+1

幹得好,並感謝您發佈全面的答案。只要系統允許,你應該接受你自己的答案。 –

+1

但真正的問題是,你正在使用Swift 2.對Swift 2的支持正在消失。更新會更好。 – matt

+0

我知道,稍後會做 – Victor

相關問題