mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Reaction experiments
This commit is contained in:
@@ -241,6 +241,7 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
|
||||
private let scrollNode: ASDisplayNode
|
||||
|
||||
private var reactionContextNode: ReactionContextNode?
|
||||
private var reactionPreviewView: ReactionPreviewView?
|
||||
private var reactionContextNodeIsAnimatingOut: Bool = false
|
||||
|
||||
private var itemContentNode: ItemContentNode?
|
||||
@@ -637,6 +638,7 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
|
||||
var animateReactionsIn = false
|
||||
var contentTopInset: CGFloat = topInset
|
||||
var removedReactionContextNode: ReactionContextNode?
|
||||
|
||||
if let reactionItems = self.actionsStackNode.topReactionItems, !reactionItems.reactionItems.isEmpty {
|
||||
let reactionContextNode: ReactionContextNode
|
||||
if let current = self.reactionContextNode {
|
||||
@@ -733,6 +735,25 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
|
||||
removedReactionContextNode = reactionContextNode
|
||||
}
|
||||
|
||||
let reactionPreviewSize = CGSize(width: 100.0, height: 100.0)
|
||||
let reactionPreviewInset: CGFloat = 7.0
|
||||
var removedReactionPreviewView: ReactionPreviewView?
|
||||
if self.reactionContextNode == nil, let previewReaction = self.actionsStackNode.topPreviewReaction {
|
||||
let reactionPreviewView: ReactionPreviewView
|
||||
if let current = self.reactionPreviewView {
|
||||
reactionPreviewView = current
|
||||
} else {
|
||||
reactionPreviewView = ReactionPreviewView(context: previewReaction.context, file: previewReaction.file)
|
||||
self.reactionPreviewView = reactionPreviewView
|
||||
self.view.addSubview(reactionPreviewView)
|
||||
}
|
||||
|
||||
contentTopInset += reactionPreviewSize.height + reactionPreviewInset
|
||||
} else {
|
||||
removedReactionPreviewView = self.reactionPreviewView
|
||||
self.reactionPreviewView = nil
|
||||
}
|
||||
|
||||
if let contentNode = itemContentNode {
|
||||
switch stateTransition {
|
||||
case .animateIn, .animateOut:
|
||||
@@ -963,6 +984,14 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
|
||||
self.proposedReactionsPositionLock = nil
|
||||
}
|
||||
|
||||
if let reactionPreviewView = self.reactionPreviewView {
|
||||
let anchorRect = contentRect.offsetBy(dx: contentParentGlobalFrame.minX, dy: 0.0)
|
||||
|
||||
let reactionPreviewFrame = CGRect(origin: CGPoint(x: floor((anchorRect.midX - reactionPreviewSize.width * 0.5)), y: anchorRect.minY - reactionPreviewInset - reactionPreviewSize.height), size: reactionPreviewSize)
|
||||
transition.updateFrame(view: reactionPreviewView, frame: reactionPreviewFrame)
|
||||
reactionPreviewView.update(size: reactionPreviewFrame.size)
|
||||
}
|
||||
|
||||
if let _ = self.currentReactionsPositionLock {
|
||||
transition.updateAlpha(node: self.actionsStackNode, alpha: 0.0)
|
||||
} else {
|
||||
@@ -976,6 +1005,12 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
|
||||
})
|
||||
}
|
||||
|
||||
if let removedReactionPreviewView {
|
||||
transition.updateAlpha(layer: removedReactionPreviewView.layer, alpha: 0.0, completion: { [weak removedReactionPreviewView] _ in
|
||||
removedReactionPreviewView?.removeFromSuperview()
|
||||
})
|
||||
}
|
||||
|
||||
transition.updateFrame(node: self.contentRectDebugNode, frame: contentRect, beginWithCurrentState: true)
|
||||
|
||||
var actionsFrame: CGRect
|
||||
@@ -1205,6 +1240,29 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
|
||||
damping: springDamping,
|
||||
additive: true
|
||||
)
|
||||
|
||||
if let reactionPreviewView = self.reactionPreviewView {
|
||||
reactionPreviewView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
||||
reactionPreviewView.layer.animateSpring(
|
||||
from: -animationInContentYDistance as NSNumber, to: 0.0 as NSNumber,
|
||||
keyPath: "position.y",
|
||||
duration: duration,
|
||||
delay: 0.0,
|
||||
initialVelocity: 0.0,
|
||||
damping: springDamping,
|
||||
additive: true
|
||||
)
|
||||
reactionPreviewView.layer.animateSpring(
|
||||
from: 0.01 as NSNumber,
|
||||
to: 1.0 as NSNumber,
|
||||
keyPath: "transform.scale",
|
||||
duration: duration,
|
||||
delay: 0.0,
|
||||
initialVelocity: 0.0,
|
||||
damping: springDamping,
|
||||
additive: false
|
||||
)
|
||||
}
|
||||
} else if let contentNode = controllerContentNode {
|
||||
if case let .controller(source) = self.source, let transitionInfo = source.transitionInfo(), let (sourceView, sourceRect) = transitionInfo.sourceNode() {
|
||||
let sourcePoint = sourceView.convert(sourceRect.center, to: self.view)
|
||||
@@ -1493,6 +1551,32 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
if let reactionPreviewView = self.reactionPreviewView {
|
||||
reactionPreviewView.layer.animate(
|
||||
from: 0.0 as NSNumber,
|
||||
to: -animationInContentYDistance as NSNumber,
|
||||
keyPath: "position.y",
|
||||
timingFunction: timingFunction,
|
||||
duration: duration,
|
||||
delay: 0.0,
|
||||
removeOnCompletion: true,
|
||||
additive: true,
|
||||
completion: { _ in
|
||||
}
|
||||
)
|
||||
reactionPreviewView.layer.animate(
|
||||
from: 1.0 as NSNumber,
|
||||
to: 0.01 as NSNumber,
|
||||
keyPath: "transform.scale",
|
||||
timingFunction: timingFunction,
|
||||
duration: duration,
|
||||
delay: 0.0,
|
||||
removeOnCompletion: false,
|
||||
additive: false
|
||||
)
|
||||
reactionPreviewView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in })
|
||||
}
|
||||
}
|
||||
if let contentNode = controllerContentNode {
|
||||
if case let .controller(source) = self.source, let transitionInfo = source.transitionInfo(), let (sourceView, sourceRect) = transitionInfo.sourceNode() {
|
||||
|
||||
Reference in New Issue
Block a user