Fix chart zooming crash

This commit is contained in:
Ilya Laktyushin 2020-03-23 21:38:05 +04:00
parent 850b19e607
commit 43d889a1ba
4 changed files with 57 additions and 32 deletions

View File

@ -57,6 +57,7 @@ public class TwoAxisStepBarsChartController: BaseLinesChartController {
super.setupChartCollection(chartsCollection: chartsCollection, animated: animated, isZoomed: isZoomed) super.setupChartCollection(chartsCollection: chartsCollection, animated: animated, isZoomed: isZoomed)
for (index, controller) in self.graphControllers.enumerated() { for (index, controller) in self.graphControllers.enumerated() {
if index < chartsCollection.chartValues.count {
let chart = chartsCollection.chartValues[index] let chart = chartsCollection.chartValues[index]
let initialComponents = [BarChartRenderer.BarsData.Component(color: chart.color, let initialComponents = [BarChartRenderer.BarsData.Component(color: chart.color,
values: chart.values.map { CGFloat($0) })] values: chart.values.map { CGFloat($0) })]
@ -84,6 +85,12 @@ public class TwoAxisStepBarsChartController: BaseLinesChartController {
controller.verticalScalesRenderer.setHorizontalLinesVisible((index == 0), animated: animated) controller.verticalScalesRenderer.setHorizontalLinesVisible((index == 0), animated: animated)
controller.verticalScalesRenderer.isRightAligned = (index != 0) controller.verticalScalesRenderer.isRightAligned = (index != 0)
controller.verticalScalesRenderer.isEnabled = true
} else {
controller.mainBarsRenderer.bars = BarChartRenderer.BarsData(barWidth: 0.0, locations: [], components: [])
controller.previewBarsRenderer.bars = BarChartRenderer.BarsData(barWidth: 0.0, locations: [], components: [])
controller.verticalScalesRenderer.setHorizontalLinesVisible(false, animated: animated)
}
} }
self.prevoiusHorizontalStrideInterval = -1 self.prevoiusHorizontalStrideInterval = -1
@ -149,7 +156,9 @@ public class TwoAxisStepBarsChartController: BaseLinesChartController {
let chartFrame = self.chartFrame() let chartFrame = self.chartFrame()
guard chartFrame.width > 0 else { return } guard chartFrame.width > 0 else { return }
let dateToFind = Date(timeIntervalSince1970: TimeInterval(horizontalRange.distance * point.x + horizontalRange.lowerBound)) let barsWidth = graphControllers.first?.barsWidth ?? 0.0
let dateToFind = Date(timeIntervalSince1970: TimeInterval(horizontalRange.distance * point.x + horizontalRange.lowerBound + barsWidth / 2.0))
guard let (closestDate, minIndex) = findClosestDateTo(dateToFind: dateToFind) else { return } guard let (closestDate, minIndex) = findClosestDateTo(dateToFind: dateToFind) else { return }
let chartInteractionWasBegin = isChartInteractionBegun let chartInteractionWasBegin = isChartInteractionBegun

View File

@ -220,10 +220,15 @@ open class ManagedAnimationNode: ASDisplayNode {
state.relativeTime += animationAdvancement state.relativeTime += animationAdvancement
if state.relativeTime >= duration && !self.didTryAdvancingState { if state.relativeTime >= duration && !self.didTryAdvancingState {
if state.item.loop && self.trackStack.isEmpty {
state.frameIndex = nil
state.relativeTime = 0.0
} else {
self.didTryAdvancingState = true self.didTryAdvancingState = true
self.advanceState() self.advanceState()
} }
} }
}
public func trackTo(item: ManagedAnimationItem) { public func trackTo(item: ManagedAnimationItem) {
self.trackStack.append(item) self.trackStack.append(item)

View File

@ -148,7 +148,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
} }
private func setupNode(item: ChatMessageItem) { private func setupNode(item: ChatMessageItem) {
if let telegramDice = self.telegramDice, let diceEmojis = item.associatedData.animatedEmojiStickers["🎲"] { guard self.animationNode == nil else {
return
}
if let _ = self.telegramDice {
let diceEmojis = item.associatedData.animatedEmojiStickers["🎲"] ?? []
let animationNode = ManagedDiceAnimationNode(context: item.context, emojis: diceEmojis.map { $0.file }) let animationNode = ManagedDiceAnimationNode(context: item.context, emojis: diceEmojis.map { $0.file })
self.animationNode = animationNode self.animationNode = animationNode
} else { } else {

View File

@ -26,7 +26,7 @@ final class ManagedDiceAnimationNode: ManagedAnimationNode, GenericAnimatedStick
super.init(size: CGSize(width: 136.0, height: 136.0)) super.init(size: CGSize(width: 136.0, height: 136.0))
self.trackTo(item: ManagedAnimationItem(source: .local("DiceRolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 0), duration: 0.3)) self.trackTo(item: ManagedAnimationItem(source: .local("Dice_Rolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 60), duration: 1.0, loop: true))
} }
deinit { deinit {
@ -42,6 +42,9 @@ final class ManagedDiceAnimationNode: ManagedAnimationNode, GenericAnimatedStick
case .rolling: case .rolling:
switch diceState { switch diceState {
case let .value(value): case let .value(value):
guard self.emojis.count == 6 else {
return
}
let file = self.emojis[Int(value) - 1] let file = self.emojis[Int(value) - 1]
let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512) let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512)
let fittedSize = dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0)) let fittedSize = dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0))
@ -73,7 +76,7 @@ final class ManagedDiceAnimationNode: ManagedAnimationNode, GenericAnimatedStick
case let .value(currentValue): case let .value(currentValue):
switch diceState { switch diceState {
case .rolling: case .rolling:
self.trackTo(item: ManagedAnimationItem(source: .local("DiceRolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 180), duration: 3.0, loop: true)) self.trackTo(item: ManagedAnimationItem(source: .local("Dice_Rolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 60), duration: 1.0, loop: true))
case let .value(value): case let .value(value):
break break
} }
@ -81,6 +84,9 @@ final class ManagedDiceAnimationNode: ManagedAnimationNode, GenericAnimatedStick
} else { } else {
switch diceState { switch diceState {
case let .value(value): case let .value(value):
guard self.emojis.count == 6 else {
return
}
let file = self.emojis[Int(value) - 1] let file = self.emojis[Int(value) - 1]
let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512) let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512)
let fittedSize = dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0)) let fittedSize = dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0))
@ -107,7 +113,7 @@ final class ManagedDiceAnimationNode: ManagedAnimationNode, GenericAnimatedStick
} }
})) }))
case .rolling: case .rolling:
self.trackTo(item: ManagedAnimationItem(source: .local("DiceRolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 0), duration: 0.3, loop: true)) self.trackTo(item: ManagedAnimationItem(source: .local("Dice_Rolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 60), duration: 1.0, loop: true))
} }
} }
} }