mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fix solid rounded button gloss animation on high refresh rate screens
This commit is contained in:
parent
4c5f504346
commit
2e12321d82
@ -203,7 +203,7 @@ public final class SolidRoundedButtonGlossNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
private var progress: CGFloat = 0.0
|
private var progress: CGFloat = 0.0
|
||||||
private var displayLink: CADisplayLink?
|
private var animator: ConstantDisplayLinkAnimator?
|
||||||
private let buttonCornerRadius: CGFloat
|
private let buttonCornerRadius: CGFloat
|
||||||
private var gradientColors: NSArray?
|
private var gradientColors: NSArray?
|
||||||
|
|
||||||
@ -216,28 +216,33 @@ public final class SolidRoundedButtonGlossNode: ASDisplayNode {
|
|||||||
self.isOpaque = false
|
self.isOpaque = false
|
||||||
self.isLayerBacked = true
|
self.isLayerBacked = true
|
||||||
|
|
||||||
class DisplayLinkProxy: NSObject {
|
var previousTime: CFAbsoluteTime?
|
||||||
weak var target: SolidRoundedButtonGlossNode?
|
self.animator = ConstantDisplayLinkAnimator(update: { [weak self] in
|
||||||
init(target: SolidRoundedButtonGlossNode) {
|
guard let strongSelf = self else {
|
||||||
self.target = target
|
return
|
||||||
}
|
}
|
||||||
|
let currentTime = CFAbsoluteTimeGetCurrent()
|
||||||
@objc func displayLinkEvent() {
|
if let previousTime = previousTime {
|
||||||
self.target?.displayLinkEvent()
|
var delta: CGFloat
|
||||||
|
if strongSelf.progress < 0.05 || strongSelf.progress > 0.95 {
|
||||||
|
delta = 0.001
|
||||||
|
} else {
|
||||||
|
delta = 0.009
|
||||||
}
|
}
|
||||||
|
delta *= CGFloat(currentTime - previousTime) * 60.0
|
||||||
|
var newProgress = strongSelf.progress + delta
|
||||||
|
if newProgress > 1.0 {
|
||||||
|
newProgress = 0.0
|
||||||
}
|
}
|
||||||
|
strongSelf.progress = newProgress
|
||||||
self.displayLink = CADisplayLink(target: DisplayLinkProxy(target: self), selector: #selector(DisplayLinkProxy.displayLinkEvent))
|
strongSelf.setNeedsDisplay()
|
||||||
self.displayLink?.isPaused = true
|
}
|
||||||
self.displayLink?.add(to: RunLoop.main, forMode: .common)
|
previousTime = currentTime
|
||||||
|
})
|
||||||
|
|
||||||
self.updateGradientColors()
|
self.updateGradientColors()
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
|
||||||
self.displayLink?.invalidate()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func updateGradientColors() {
|
private func updateGradientColors() {
|
||||||
let transparentColor = self.color.withAlphaComponent(0.0).cgColor
|
let transparentColor = self.color.withAlphaComponent(0.0).cgColor
|
||||||
self.gradientColors = [transparentColor, transparentColor, self.color.withAlphaComponent(0.12).cgColor, transparentColor, transparentColor]
|
self.gradientColors = [transparentColor, transparentColor, self.color.withAlphaComponent(0.12).cgColor, transparentColor, transparentColor]
|
||||||
@ -245,27 +250,12 @@ public final class SolidRoundedButtonGlossNode: ASDisplayNode {
|
|||||||
|
|
||||||
override public func willEnterHierarchy() {
|
override public func willEnterHierarchy() {
|
||||||
super.willEnterHierarchy()
|
super.willEnterHierarchy()
|
||||||
self.displayLink?.isPaused = false
|
self.animator?.isPaused = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override public func didExitHierarchy() {
|
override public func didExitHierarchy() {
|
||||||
super.didExitHierarchy()
|
super.didExitHierarchy()
|
||||||
self.displayLink?.isPaused = true
|
self.animator?.isPaused = true
|
||||||
}
|
|
||||||
|
|
||||||
private func displayLinkEvent() {
|
|
||||||
let delta: CGFloat
|
|
||||||
if self.progress < 0.05 || self.progress > 0.95 {
|
|
||||||
delta = 0.001
|
|
||||||
} else {
|
|
||||||
delta = 0.009
|
|
||||||
}
|
|
||||||
var newProgress = self.progress + delta
|
|
||||||
if newProgress > 1.0 {
|
|
||||||
newProgress = 0.0
|
|
||||||
}
|
|
||||||
self.progress = newProgress
|
|
||||||
self.setNeedsDisplay()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
|
override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user