2016-07-20 70 views
1

我很难尝试暂停并从任何UIView旋转技术的旋转当前状态继续。无限旋转UIView并暂停/停止动画,保持状态,并继续从当前状态旋转

尝试:

CGAffineTransformRotate 
CGAffineTransformMakeRotation 
CATransform3DMakeRotation 
CABasicAnimation 

基本上,如果我叫view.layer.removeAllAnimations()layer.speed = 0,他们都重置当前旋转度。

此外,还试图快照视图使用图像,而不是真正的旋转,但没有运气,因为快照忽略旋转。

回答

6

终于得偿所愿,与一个以上的答案上如此,许多在Objective-C,把它们放在一起在UIView的扩展,并将其记录:

extension UIView { 

     /** 
     Will rotate `self` for ever. 

     - Parameter duration: The duration in seconds of a complete rotation (360º). 
     - Parameter clockwise: If false, will rotate counter-clockwise. 
     */ 
     func startRotating(duration duration: Double, clockwise: Bool) { 
      let kAnimationKey = "rotation" 
      var currentState = CGFloat(0) 

      // Get current state 
      if let presentationLayer = layer.presentationLayer(), zValue = presentationLayer.valueForKeyPath("transform.rotation.z"){ 
       currentState = CGFloat(zValue.floatValue) 
      } 

      if self.layer.animationForKey(kAnimationKey) == nil { 
       let animate = CABasicAnimation(keyPath: "transform.rotation") 
       animate.duration = duration 
       animate.repeatCount = Float.infinity 
       animate.fromValue = currentState //Should the value be nil, will start from 0 a.k.a. "the beginning". 
       animate.byValue = clockwise ? Float(M_PI * 2.0) : -Float(M_PI * 2.0) 
       self.layer.addAnimation(animate, forKey: kAnimationKey) 
      } 
     } 

     /// Will stop a `startRotating(duration: _, clockwise: _)` instance. 
     func stopRotating() { 
      let kAnimationKey = "rotation" 
      var currentState = CGFloat(0) 

      // Get current state 
      if let presentationLayer = layer.presentationLayer(), zValue = presentationLayer.valueForKeyPath("transform.rotation.z"){ 
       currentState = CGFloat(zValue.floatValue) 
      } 

      if self.layer.animationForKey(kAnimationKey) != nil { 
       self.layer.removeAnimationForKey(kAnimationKey) 
      } 

      // Leave self as it was when stopped. 
      layer.transform = CATransform3DMakeRotation(currentState, 0, 0, 1) 
     } 

    } 

使用它像yourView.startRotating(duration: 1, clockwise: true),后来停止做yourView.stopRotating()