【问题标题】:Rotate UIView infinitely and pause/stop animation, keep state, and continue rotating from current state无限旋转 UIView 并暂停/停止动画,保持状态,并从当前状态继续旋转
【发布时间】:2016-11-23 02:31:07
【问题描述】:

我很难尝试暂停并从当前的旋转状态继续任何 UIView 旋转技术。

试过了:

CGAffineTransformRotate
CGAffineTransformMakeRotation
CATransform3DMakeRotation
CABasicAnimation

基本上,如果我调用view.layer.removeAllAnimations()layer.speed = 0,它们都会重置当前的旋转度数。

还尝试对视图进行快照以使用图像而不是真正的旋转,但没有运气,因为快照忽略了旋转。

【问题讨论】:

    标签: ios swift cocoa-touch uiview rotation


    【解决方案1】:

    终于明白了,关于 SO 的答案不止一个,很多在 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()

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多