mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fix chart zooming crash
This commit is contained in:
parent
850b19e607
commit
43d889a1ba
@ -57,33 +57,40 @@ 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() {
|
||||||
let chart = chartsCollection.chartValues[index]
|
if index < chartsCollection.chartValues.count {
|
||||||
let initialComponents = [BarChartRenderer.BarsData.Component(color: chart.color,
|
let chart = chartsCollection.chartValues[index]
|
||||||
values: chart.values.map { CGFloat($0) })]
|
let initialComponents = [BarChartRenderer.BarsData.Component(color: chart.color,
|
||||||
let (width, chartBars, totalHorizontalRange, totalVerticalRange) = BarChartRenderer.BarsData.initialComponents(chartsCollection: chartsCollection, separate: true, initialComponents: initialComponents)
|
values: chart.values.map { CGFloat($0) })]
|
||||||
controller.chartBars = chartBars
|
let (width, chartBars, totalHorizontalRange, totalVerticalRange) = BarChartRenderer.BarsData.initialComponents(chartsCollection: chartsCollection, separate: true, initialComponents: initialComponents)
|
||||||
controller.verticalScalesRenderer.labelsColor = chart.color
|
controller.chartBars = chartBars
|
||||||
controller.barsWidth = width
|
controller.verticalScalesRenderer.labelsColor = chart.color
|
||||||
controller.totalVerticalRange = totalVerticalRange
|
controller.barsWidth = width
|
||||||
self.totalHorizontalRange = totalHorizontalRange
|
controller.totalVerticalRange = totalVerticalRange
|
||||||
|
self.totalHorizontalRange = totalHorizontalRange
|
||||||
var bullets: [LineBulletsRenderer.Bullet] = []
|
|
||||||
if let component = chartBars.components.first {
|
var bullets: [LineBulletsRenderer.Bullet] = []
|
||||||
for i in 0 ..< chartBars.locations.count {
|
if let component = chartBars.components.first {
|
||||||
let location = chartBars.locations[i]
|
for i in 0 ..< chartBars.locations.count {
|
||||||
let value = component.values[i]
|
let location = chartBars.locations[i]
|
||||||
bullets.append(LineBulletsRenderer.Bullet(coordinate: CGPoint(x: location, y: value), offset: .zero, color: component.color))
|
let value = component.values[i]
|
||||||
|
bullets.append(LineBulletsRenderer.Bullet(coordinate: CGPoint(x: location, y: value), offset: .zero, color: component.color))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
controller.lineBulletsRenderer.bullets = bullets
|
||||||
|
controller.previewBarsRenderer.setup(horizontalRange: self.totalHorizontalRange, animated: animated)
|
||||||
|
controller.previewBarsRenderer.setup(verticalRange: controller.totalVerticalRange, animated: animated)
|
||||||
|
controller.mainBarsRenderer.bars = chartBars
|
||||||
|
controller.previewBarsRenderer.bars = chartBars
|
||||||
|
|
||||||
|
controller.verticalScalesRenderer.setHorizontalLinesVisible((index == 0), animated: animated)
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
controller.lineBulletsRenderer.bullets = bullets
|
|
||||||
controller.previewBarsRenderer.setup(horizontalRange: self.totalHorizontalRange, animated: animated)
|
|
||||||
controller.previewBarsRenderer.setup(verticalRange: controller.totalVerticalRange, animated: animated)
|
|
||||||
controller.mainBarsRenderer.bars = chartBars
|
|
||||||
controller.previewBarsRenderer.bars = chartBars
|
|
||||||
|
|
||||||
controller.verticalScalesRenderer.setHorizontalLinesVisible((index == 0), animated: animated)
|
|
||||||
controller.verticalScalesRenderer.isRightAligned = (index != 0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
@ -220,8 +220,13 @@ open class ManagedAnimationNode: ASDisplayNode {
|
|||||||
state.relativeTime += animationAdvancement
|
state.relativeTime += animationAdvancement
|
||||||
|
|
||||||
if state.relativeTime >= duration && !self.didTryAdvancingState {
|
if state.relativeTime >= duration && !self.didTryAdvancingState {
|
||||||
self.didTryAdvancingState = true
|
if state.item.loop && self.trackStack.isEmpty {
|
||||||
self.advanceState()
|
state.frameIndex = nil
|
||||||
|
state.relativeTime = 0.0
|
||||||
|
} else {
|
||||||
|
self.didTryAdvancingState = true
|
||||||
|
self.advanceState()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user