diff --git a/submodules/Components/ReactionButtonListComponent/Sources/ReactionButtonListComponent.swift b/submodules/Components/ReactionButtonListComponent/Sources/ReactionButtonListComponent.swift index e817c7c61b..3550d08997 100644 --- a/submodules/Components/ReactionButtonListComponent/Sources/ReactionButtonListComponent.swift +++ b/submodules/Components/ReactionButtonListComponent/Sources/ReactionButtonListComponent.swift @@ -835,6 +835,7 @@ public final class ReactionNodePool { func putBack(view: ReactionButtonAsyncNode) { assert(view.superview == nil) + assert(view.layer.superlayer == nil) if self.views.count < 64 { view.reset() @@ -844,7 +845,12 @@ public final class ReactionNodePool { func take() -> Item { if !self.views.isEmpty { - return Item(view: self.views.removeLast(), pool: self) + let view = self.views.removeLast() + view.layer.removeAllAnimations() + view.alpha = 1.0 + view.isHidden = false + view.transform = .identity + return Item(view: view, pool: self) } else { return Item(view: ReactionButtonAsyncNode(), pool: self) } diff --git a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift index be2fc20662..c5110500c3 100644 --- a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift @@ -801,7 +801,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { reactionButtonPosition.y += item.size.height + 6.0 } - if item.node.view.superview == nil { + if item.node.view.superview != strongSelf.view { + assert(item.node.view.superview == nil) strongSelf.view.addSubview(item.node.view) item.node.view.frame = CGRect(origin: reactionButtonPosition, size: item.size) @@ -1072,6 +1073,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { if animation.isAnimated { node.layer.animateScale(from: 1.0, to: 0.1, duration: 0.2, removeOnCompletion: false) node.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak node] _ in + node?.layer.removeAllAnimations() node?.removeFromSupernode() }) } else { diff --git a/submodules/TelegramUI/Sources/ChatMessageReactionsFooterContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageReactionsFooterContentNode.swift index d425830a31..8db5c338b3 100644 --- a/submodules/TelegramUI/Sources/ChatMessageReactionsFooterContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageReactionsFooterContentNode.swift @@ -308,7 +308,8 @@ final class MessageReactionButtonsNode: ASDisplayNode { strongSelf.backgroundMaskButtons[item.value] = itemMaskView } - if item.node.view.superview == nil { + if item.node.view.superview != strongSelf.view { + assert(item.node.view.superview == nil) strongSelf.view.addSubview(item.node.view) if animation.isAnimated { item.node.view.layer.animateScale(from: 0.01, to: 1.0, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) @@ -336,15 +337,18 @@ final class MessageReactionButtonsNode: ASDisplayNode { } item.node.view.additionalActivationProgressLayer = itemMaskView.layer - if itemMaskView.superview == nil { - strongSelf.backgroundMaskView?.addSubview(itemMaskView) - if animation.isAnimated { - itemMaskView.layer.animateScale(from: 0.01, to: 1.0, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) - itemMaskView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + if let backgroundMaskView = strongSelf.backgroundMaskView { + if itemMaskView.superview != backgroundMaskView { + assert(itemMaskView.superview == nil) + backgroundMaskView.addSubview(itemMaskView) + if animation.isAnimated { + itemMaskView.layer.animateScale(from: 0.01, to: 1.0, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) + itemMaskView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + itemMaskView.frame = itemMaskFrame + } else { + animation.animator.updateFrame(layer: itemMaskView.layer, frame: itemMaskFrame, completion: nil) } - itemMaskView.frame = itemMaskFrame - } else { - animation.animator.updateFrame(layer: itemMaskView.layer, frame: itemMaskFrame, completion: nil) } } @@ -355,6 +359,7 @@ final class MessageReactionButtonsNode: ASDisplayNode { if animation.isAnimated { view.layer.animateScale(from: 1.0, to: 0.01, duration: 0.2, removeOnCompletion: false) view.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak view] _ in + view?.layer.removeAllAnimations() view?.removeFromSuperview() }) } else {