mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
108 lines
4.1 KiB
Swift
108 lines
4.1 KiB
Swift
import Foundation
|
|
import AsyncDisplayKit
|
|
import Display
|
|
import GenerateStickerPlaceholderImage
|
|
|
|
public class StickerShimmerEffectNode: ASDisplayNode {
|
|
private var backdropNode: ASDisplayNode?
|
|
private let backgroundNode: ASDisplayNode
|
|
private let effectNode: ShimmerEffectForegroundNode
|
|
private let foregroundNode: ASImageNode
|
|
|
|
private var maskView: UIImageView?
|
|
|
|
private var currentData: Data?
|
|
private var currentBackgroundColor: UIColor?
|
|
private var currentForegroundColor: UIColor?
|
|
private var currentShimmeringColor: UIColor?
|
|
private var currentSize = CGSize()
|
|
|
|
public override init() {
|
|
self.backgroundNode = ASDisplayNode()
|
|
self.effectNode = ShimmerEffectForegroundNode()
|
|
self.foregroundNode = ASImageNode()
|
|
|
|
super.init()
|
|
|
|
self.addSubnode(self.backgroundNode)
|
|
self.addSubnode(self.effectNode)
|
|
self.addSubnode(self.foregroundNode)
|
|
}
|
|
|
|
public var isEmpty: Bool {
|
|
return self.currentData == nil
|
|
}
|
|
|
|
public func addBackdropNode(_ backdropNode: ASDisplayNode) {
|
|
if let current = self.backdropNode {
|
|
current.removeFromSupernode()
|
|
}
|
|
self.backdropNode = backdropNode
|
|
self.insertSubnode(backdropNode, at: 0)
|
|
|
|
backdropNode.isHidden = self.effectNode.isHidden
|
|
|
|
self.effectNode.layer.compositingFilter = "screenBlendMode"
|
|
}
|
|
|
|
public func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) {
|
|
self.effectNode.updateAbsoluteRect(rect, within: containerSize)
|
|
}
|
|
|
|
public func update(backgroundColor: UIColor?, foregroundColor: UIColor, shimmeringColor: UIColor, data: Data?, size: CGSize, enableEffect: Bool, imageSize: CGSize = CGSize(width: 512.0, height: 512.0)) {
|
|
if data == nil {
|
|
return
|
|
}
|
|
if self.currentData == data, let currentBackgroundColor = self.currentBackgroundColor, currentBackgroundColor.isEqual(backgroundColor), let currentForegroundColor = self.currentForegroundColor, currentForegroundColor.isEqual(foregroundColor), let currentShimmeringColor = self.currentShimmeringColor, currentShimmeringColor.isEqual(shimmeringColor), self.currentSize == size {
|
|
return
|
|
}
|
|
|
|
self.currentBackgroundColor = backgroundColor
|
|
self.currentForegroundColor = foregroundColor
|
|
self.currentShimmeringColor = shimmeringColor
|
|
self.currentData = data
|
|
self.currentSize = size
|
|
|
|
self.backgroundNode.backgroundColor = foregroundColor
|
|
//self.backgroundNode.isHidden = true//!enableEffect
|
|
|
|
if enableEffect {
|
|
self.effectNode.update(backgroundColor: backgroundColor == nil ? .clear : foregroundColor, foregroundColor: shimmeringColor, horizontal: true, effectSize: nil, globalTimeOffset: true, duration: nil)
|
|
}
|
|
self.effectNode.isHidden = !enableEffect
|
|
self.backdropNode?.isHidden = !enableEffect
|
|
|
|
let bounds = CGRect(origin: CGPoint(), size: size)
|
|
let image = generateStickerPlaceholderImage(data: data, size: size, imageSize: imageSize, backgroundColor: backgroundColor, foregroundColor: enableEffect ? .black : foregroundColor)
|
|
|
|
if backgroundColor == nil && enableEffect {
|
|
self.foregroundNode.image = nil
|
|
|
|
let maskView: UIImageView
|
|
if let current = self.maskView {
|
|
maskView = current
|
|
} else {
|
|
maskView = UIImageView()
|
|
maskView.frame = bounds
|
|
self.maskView = maskView
|
|
self.view.mask = maskView
|
|
}
|
|
|
|
} else {
|
|
self.foregroundNode.image = image
|
|
|
|
if let _ = self.maskView {
|
|
self.view.mask = nil
|
|
self.maskView = nil
|
|
}
|
|
}
|
|
|
|
self.maskView?.image = image
|
|
|
|
self.backdropNode?.frame = bounds
|
|
self.backgroundNode.frame = bounds
|
|
self.foregroundNode.frame = bounds
|
|
self.effectNode.frame = bounds
|
|
}
|
|
}
|