diff --git a/submodules/RadialStatusNode/BUILD b/submodules/RadialStatusNode/BUILD index c759d1bc5a..264f6f4f6d 100644 --- a/submodules/RadialStatusNode/BUILD +++ b/submodules/RadialStatusNode/BUILD @@ -13,6 +13,7 @@ swift_library( "//submodules/Display:Display", "//submodules/AsyncDisplayKit:AsyncDisplayKit", "//submodules/LegacyComponents:LegacyComponents", + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", ], visibility = [ "//visibility:public", diff --git a/submodules/RadialStatusNode/Sources/RadialProgressContentNode.swift b/submodules/RadialStatusNode/Sources/RadialProgressContentNode.swift index cf57dddbe2..79cd25485a 100644 --- a/submodules/RadialStatusNode/Sources/RadialProgressContentNode.swift +++ b/submodules/RadialStatusNode/Sources/RadialProgressContentNode.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import LegacyComponents +import SwiftSignalKit private final class RadialProgressContentCancelNodeParameters: NSObject { let color: UIColor @@ -159,23 +160,28 @@ private final class RadialProgressContentSpinnerNode: ASDisplayNode { } } + private var hierarchyVersion: Int = 0 override func willEnterHierarchy() { super.willEnterHierarchy() if self.animateRotation { - let basicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") - basicAnimation.duration = 1.5 - var fromValue = Float.pi + 0.58 - if let presentation = self.layer.presentation(), let value = (presentation.value(forKeyPath: "transform.rotation.z") as? NSNumber)?.floatValue { - fromValue = value - } - basicAnimation.fromValue = NSNumber(value: fromValue) - basicAnimation.toValue = NSNumber(value: fromValue + Float.pi * 2.0) - basicAnimation.repeatCount = Float.infinity - basicAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear) - basicAnimation.beginTime = 0.0 + self.hierarchyVersion += 1 - self.layer.add(basicAnimation, forKey: "progressRotation") + if self.layer.animation(forKey: "progressRotation") == nil { + let basicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") + basicAnimation.duration = 1.5 + var fromValue = Float.pi + 0.58 + if let presentation = self.layer.presentation(), let value = (presentation.value(forKeyPath: "transform.rotation.z") as? NSNumber)?.floatValue { + fromValue = value + } + basicAnimation.fromValue = NSNumber(value: fromValue) + basicAnimation.toValue = NSNumber(value: fromValue + Float.pi * 2.0) + basicAnimation.repeatCount = Float.infinity + basicAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear) + basicAnimation.beginTime = 0.0 + + self.layer.add(basicAnimation, forKey: "progressRotation") + } } } @@ -183,7 +189,12 @@ private final class RadialProgressContentSpinnerNode: ASDisplayNode { super.didExitHierarchy() if self.animateRotation { - self.layer.removeAnimation(forKey: "progressRotation") + let version = self.hierarchyVersion + Queue.mainQueue().after(0.1, { + if self.hierarchyVersion == version { + self.layer.removeAnimation(forKey: "progressRotation") + } + }) } } }