mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Merge commit '0e225c0226bac95b252cf54e448340d673209c74'
This commit is contained in:
commit
e8c77a0a39
@ -174,7 +174,10 @@ final class CommandChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
|
|
||||||
if let topItemOffset = topItemOffset {
|
if let topItemOffset = topItemOffset {
|
||||||
let position = strongSelf.listView.layer.position
|
let position = strongSelf.listView.layer.position
|
||||||
strongSelf.listView.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset)), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
strongSelf.listView.position = CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset))
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
strongSelf.listView.position = position
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -120,6 +120,7 @@ final class CommandMenuChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
if sendImmediately {
|
if sendImmediately {
|
||||||
interfaceInteraction.sendBotCommand(command.peer, "/" + command.command.text)
|
interfaceInteraction.sendBotCommand(command.peer, "/" + command.command.text)
|
||||||
} else {
|
} else {
|
||||||
|
interfaceInteraction.updateShowCommands { _ in return false }
|
||||||
interfaceInteraction.updateTextInputStateAndMode { textInputState, inputMode in
|
interfaceInteraction.updateTextInputStateAndMode { textInputState, inputMode in
|
||||||
var commandQueryRange: NSRange?
|
var commandQueryRange: NSRange?
|
||||||
inner: for (range, type, _) in textInputStateContextQueryRangeAndType(textInputState) {
|
inner: for (range, type, _) in textInputStateContextQueryRangeAndType(textInputState) {
|
||||||
@ -128,7 +129,6 @@ final class CommandMenuChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
break inner
|
break inner
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let range = commandQueryRange {
|
if let range = commandQueryRange {
|
||||||
let inputText = NSMutableAttributedString(attributedString: textInputState.inputText)
|
let inputText = NSMutableAttributedString(attributedString: textInputState.inputText)
|
||||||
|
|
||||||
@ -143,7 +143,6 @@ final class CommandMenuChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
let selectionPosition = (inputText.string as NSString).length + 1
|
let selectionPosition = (inputText.string as NSString).length + 1
|
||||||
return (ChatTextInputState(inputText: inputText, selectionRange: selectionPosition ..< selectionPosition), inputMode)
|
return (ChatTextInputState(inputText: inputText, selectionRange: selectionPosition ..< selectionPosition), inputMode)
|
||||||
}
|
}
|
||||||
return (textInputState, inputMode)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,7 +192,10 @@ final class CommandMenuChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
|
|
||||||
if let topItemOffset = topItemOffset {
|
if let topItemOffset = topItemOffset {
|
||||||
let position = strongSelf.listView.layer.position
|
let position = strongSelf.listView.layer.position
|
||||||
strongSelf.listView.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset)), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
strongSelf.listView.position = CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset))
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
strongSelf.listView.position = position
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -72,7 +72,10 @@ final class DisabledContextResultsChatInputContextPanelNode: ChatInputContextPan
|
|||||||
|
|
||||||
func animateIn() {
|
func animateIn() {
|
||||||
let position = self.containerNode.layer.position
|
let position = self.containerNode.layer.position
|
||||||
self.containerNode.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + (self.containerNode.bounds.height)), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
self.containerNode.position = CGPoint(x: position.x, y: position.y + (self.containerNode.bounds.height))
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
self.containerNode.position = position
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func animateOut(completion: @escaping () -> Void) {
|
override func animateOut(completion: @escaping () -> Void) {
|
||||||
|
@ -190,7 +190,10 @@ final class HashtagChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
|
|
||||||
if let topItemOffset = topItemOffset {
|
if let topItemOffset = topItemOffset {
|
||||||
let position = strongSelf.listView.layer.position
|
let position = strongSelf.listView.layer.position
|
||||||
strongSelf.listView.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset)), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
strongSelf.listView.position = CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset))
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
strongSelf.listView.position = position
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -317,12 +317,17 @@ final class HorizontalListContextResultsChatInputContextPanelNode: ChatInputCont
|
|||||||
self.listView.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: options, updateSizeAndInsets: nil, updateOpaqueState: HorizontalListContextResultsOpaqueState(entryCount: transition.entryCount, hasMore: transition.hasMore), completion: { [weak self] _ in
|
self.listView.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: options, updateSizeAndInsets: nil, updateOpaqueState: HorizontalListContextResultsOpaqueState(entryCount: transition.entryCount, hasMore: transition.hasMore), completion: { [weak self] _ in
|
||||||
if let strongSelf = self, firstTime {
|
if let strongSelf = self, firstTime {
|
||||||
let position = strongSelf.listView.position
|
let position = strongSelf.listView.position
|
||||||
strongSelf.listView.isHidden = false
|
|
||||||
strongSelf.listView.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + strongSelf.listView.bounds.size.width), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
|
||||||
|
|
||||||
strongSelf.separatorNode.isHidden = false
|
|
||||||
let separatorPosition = strongSelf.separatorNode.layer.position
|
let separatorPosition = strongSelf.separatorNode.layer.position
|
||||||
strongSelf.separatorNode.layer.animatePosition(from: CGPoint(x: separatorPosition.x, y: separatorPosition.y + strongSelf.listView.bounds.size.width), to: separatorPosition, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
|
||||||
|
strongSelf.listView.isHidden = false
|
||||||
|
strongSelf.separatorNode.isHidden = false
|
||||||
|
|
||||||
|
strongSelf.listView.position = CGPoint(x: position.x, y: position.y + strongSelf.listView.bounds.size.width)
|
||||||
|
strongSelf.separatorNode.position = CGPoint(x: separatorPosition.x, y: separatorPosition.y + strongSelf.listView.bounds.size.width)
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
strongSelf.listView.position = position
|
||||||
|
strongSelf.separatorNode.position = separatorPosition
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie
|
|||||||
|
|
||||||
var previewedStickerItem: StickerPackItem?
|
var previewedStickerItem: StickerPackItem?
|
||||||
|
|
||||||
var updateBackgroundOffset: ((CGFloat, ContainedViewLayoutTransition) -> Void)?
|
var updateBackgroundOffset: ((CGFloat, Bool, ContainedViewLayoutTransition) -> Void)?
|
||||||
var sendSticker: ((FileMediaReference, ASDisplayNode, CGRect) -> Void)?
|
var sendSticker: ((FileMediaReference, ASDisplayNode, CGRect) -> Void)?
|
||||||
|
|
||||||
var getControllerInteraction: (() -> ChatControllerInteraction?)?
|
var getControllerInteraction: (() -> ChatControllerInteraction?)?
|
||||||
@ -175,13 +175,13 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie
|
|||||||
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||||
if !self.ignoreScrolling {
|
if !self.ignoreScrolling {
|
||||||
self.updateVisibleItems(synchronous: false)
|
self.updateVisibleItems(synchronous: false)
|
||||||
self.updateBackground(transition: .immediate)
|
self.updateBackground(animateIn: false, transition: .immediate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateBackground(transition: ContainedViewLayoutTransition) {
|
private func updateBackground(animateIn: Bool, transition: ContainedViewLayoutTransition) {
|
||||||
if let topInset = self.topInset {
|
if let topInset = self.topInset {
|
||||||
self.updateBackgroundOffset?(max(0.0, -self.scrollNode.view.contentOffset.y + topInset), transition)
|
self.updateBackgroundOffset?(max(0.0, -self.scrollNode.view.contentOffset.y + topInset), animateIn, transition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +228,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie
|
|||||||
let currentBackgroundOffset = max(0.0, -self.scrollNode.view.contentOffset.y + topInset)
|
let currentBackgroundOffset = max(0.0, -self.scrollNode.view.contentOffset.y + topInset)
|
||||||
if abs(currentBackgroundOffset - previousBackgroundOffset) > .ulpOfOne {
|
if abs(currentBackgroundOffset - previousBackgroundOffset) > .ulpOfOne {
|
||||||
transition.animateOffsetAdditive(node: self.scrollNode, offset: currentBackgroundOffset - previousBackgroundOffset)
|
transition.animateOffsetAdditive(node: self.scrollNode, offset: currentBackgroundOffset - previousBackgroundOffset)
|
||||||
self.updateBackground(transition: transition)
|
self.updateBackground(animateIn: false, transition: transition)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.animateInOnLayout = true
|
self.animateInOnLayout = true
|
||||||
@ -247,7 +247,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie
|
|||||||
self.validLayout = size
|
self.validLayout = size
|
||||||
|
|
||||||
if self.animateInOnLayout {
|
if self.animateInOnLayout {
|
||||||
self.updateBackgroundOffset?(size.height, .immediate)
|
self.updateBackgroundOffset?(size.height, false, .immediate)
|
||||||
}
|
}
|
||||||
|
|
||||||
var synchronous = false
|
var synchronous = false
|
||||||
@ -265,12 +265,18 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie
|
|||||||
|
|
||||||
var backgroundTransition = transition
|
var backgroundTransition = transition
|
||||||
|
|
||||||
|
var animateIn = false
|
||||||
if self.animateInOnLayout {
|
if self.animateInOnLayout {
|
||||||
|
animateIn = true
|
||||||
self.animateInOnLayout = false
|
self.animateInOnLayout = false
|
||||||
backgroundTransition = .animated(duration: 0.3, curve: .spring)
|
backgroundTransition = .animated(duration: 0.3, curve: .spring)
|
||||||
if let topInset = self.topInset {
|
if let topInset = self.topInset {
|
||||||
let currentBackgroundOffset = max(0.0, -self.scrollNode.view.contentOffset.y + topInset)
|
let currentBackgroundOffset = max(0.0, -self.scrollNode.view.contentOffset.y + topInset)
|
||||||
backgroundTransition.animateOffsetAdditive(node: self.scrollNode, offset: currentBackgroundOffset - size.height)
|
let bounds = self.scrollNode.bounds
|
||||||
|
self.scrollNode.bounds = bounds.offsetBy(dx: 0.0, dy: currentBackgroundOffset - size.height)
|
||||||
|
backgroundTransition.animateView {
|
||||||
|
self.scrollNode.bounds = bounds
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if let previousBackgroundOffset = previousBackgroundOffset, let topInset = self.topInset {
|
if let previousBackgroundOffset = previousBackgroundOffset, let topInset = self.topInset {
|
||||||
@ -281,7 +287,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.updateBackground(transition: backgroundTransition)
|
self.updateBackground(animateIn: animateIn, transition: backgroundTransition)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateItemsLayout(width: CGFloat) {
|
private func updateItemsLayout(width: CGFloat) {
|
||||||
@ -460,12 +466,17 @@ final class InlineReactionSearchPanel: ChatInputContextPanelNode {
|
|||||||
return self?.controllerInteraction
|
return self?.controllerInteraction
|
||||||
}
|
}
|
||||||
|
|
||||||
self.stickersNode.updateBackgroundOffset = { [weak self] offset, transition in
|
self.stickersNode.updateBackgroundOffset = { [weak self] offset, animateIn, transition in
|
||||||
guard let strongSelf = self, let (_, _) = strongSelf.validLayout else {
|
guard let strongSelf = self, let (_, _) = strongSelf.validLayout else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
transition.updateFrame(node: strongSelf.backgroundContainerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: offset), size: CGSize()), beginWithCurrentState: false)
|
if animateIn {
|
||||||
|
transition.animateView {
|
||||||
|
strongSelf.backgroundContainerNode.frame = CGRect(origin: CGPoint(x: 0.0, y: offset), size: CGSize())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
transition.updateFrame(node: strongSelf.backgroundContainerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: offset), size: CGSize()), beginWithCurrentState: false)
|
||||||
|
}
|
||||||
let cornersTransitionDistance: CGFloat = 20.0
|
let cornersTransitionDistance: CGFloat = 20.0
|
||||||
let cornersTransition: CGFloat = max(0.0, min(1.0, (cornersTransitionDistance - offset) / cornersTransitionDistance))
|
let cornersTransition: CGFloat = max(0.0, min(1.0, (cornersTransitionDistance - offset) / cornersTransitionDistance))
|
||||||
transition.updateSublayerTransformScaleAndOffset(node: strongSelf.backgroundTopLeftContainerNode, scale: 1.0, offset: CGPoint(x: -cornersTransition * backgroundDiameter, y: 0.0), beginWithCurrentState: true)
|
transition.updateSublayerTransformScaleAndOffset(node: strongSelf.backgroundTopLeftContainerNode, scale: 1.0, offset: CGPoint(x: -cornersTransition * backgroundDiameter, y: 0.0), beginWithCurrentState: true)
|
||||||
|
@ -217,7 +217,10 @@ final class MentionChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
|
|
||||||
if let topItemOffset = topItemOffset {
|
if let topItemOffset = topItemOffset {
|
||||||
let position = strongSelf.listView.layer.position
|
let position = strongSelf.listView.layer.position
|
||||||
strongSelf.listView.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset)), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
strongSelf.listView.position = CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset))
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
strongSelf.listView.position = position
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -303,7 +303,10 @@ final class StickersChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
|
|
||||||
if let topItemOffset = topItemOffset {
|
if let topItemOffset = topItemOffset {
|
||||||
let position = strongSelf.listView.layer.position
|
let position = strongSelf.listView.layer.position
|
||||||
strongSelf.listView.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset)), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
strongSelf.listView.position = CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset))
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
strongSelf.listView.position = position
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -257,7 +257,10 @@ final class VerticalListContextResultsChatInputContextPanelNode: ChatInputContex
|
|||||||
|
|
||||||
if let topItemOffset = topItemOffset {
|
if let topItemOffset = topItemOffset {
|
||||||
let position = strongSelf.listView.layer.position
|
let position = strongSelf.listView.layer.position
|
||||||
strongSelf.listView.layer.animatePosition(from: CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset)), to: position, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
|
strongSelf.listView.position = CGPoint(x: position.x, y: position.y + (strongSelf.listView.bounds.size.height - topItemOffset))
|
||||||
|
ContainedViewLayoutTransition.animated(duration: 0.3, curve: .spring).animateView {
|
||||||
|
strongSelf.listView.position = position
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
strongSelf.listView.isHidden = false
|
strongSelf.listView.isHidden = false
|
||||||
|
Loading…
x
Reference in New Issue
Block a user