From 329796b0ccc58e9f320b13d751cdfdd2e034e4b5 Mon Sep 17 00:00:00 2001 From: Elaine <138257830+elaine-signal@users.noreply.github.com> Date: Mon, 5 Aug 2024 09:32:07 -0600 Subject: [PATCH] Fix internal crash when call members change in keyframe animations --- .../Calls/UserInterface/CallDrawerSheet.swift | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/Signal/Calls/UserInterface/CallDrawerSheet.swift b/Signal/Calls/UserInterface/CallDrawerSheet.swift index b48f5c83ce..d14e174184 100644 --- a/Signal/Calls/UserInterface/CallDrawerSheet.swift +++ b/Signal/Calls/UserInterface/CallDrawerSheet.swift @@ -28,8 +28,6 @@ class CallDrawerSheet: InteractiveSheetViewController { private let call: SignalCall private let callSheetDataSource: CallDrawerSheetDataSource - private var tableViewTopConstraint: NSLayoutConstraint? - override var sheetBackgroundColor: UIColor { if self.useCallDrawerStyling { return UIColor(rgbHex: 0x1C1C1E) @@ -189,16 +187,17 @@ class CallDrawerSheet: InteractiveSheetViewController { minimizedHeight = callControls.currentHeight + HeightConstants.bottomPadding } + private func setTableViewTopTranslation(to translation: CGFloat) { + tableView.transform = .translate(.init(x: 0, y: translation)) + } + override public func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.tableHeaderView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: CGFloat.leastNormalMagnitude))) contentView.addSubview(tableView) - tableViewTopConstraint = tableView.autoPinEdge(toSuperviewEdge: .top, withInset: HeightConstants.initialTableInset) - tableView.autoPinEdge(toSuperviewEdge: .bottom) - tableView.autoPinEdge(toSuperviewEdge: .leading) - tableView.autoPinEdge(toSuperviewEdge: .trailing) + tableView.autoPinEdgesToSuperviewEdges() tableView.register(GroupCallMemberCell.self) @@ -315,14 +314,14 @@ class CallDrawerSheet: InteractiveSheetViewController { private func changesForSnapToMax() { self.tableView.alpha = 1 self.callControls.alpha = 0 - self.tableViewTopConstraint?.constant = 0 + self.setTableViewTopTranslation(to: 0) self.view.layoutIfNeeded() } private func changesForSnapToMin() { self.tableView.alpha = 0 self.callControls.alpha = 1 - self.tableViewTopConstraint?.constant = HeightConstants.initialTableInset + self.setTableViewTopTranslation(to: HeightConstants.initialTableInset) self.view.layoutIfNeeded() } @@ -357,8 +356,7 @@ class CallDrawerSheet: InteractiveSheetViewController { UIView.animateKeyframes(withDuration: 0, delay: 0) { UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: tableFadeAnimationPortion) { self.tableView.alpha = 0 - self.tableViewTopConstraint?.constant = HeightConstants.initialTableInset - self.view.layoutIfNeeded() + self.setTableViewTopTranslation(to: HeightConstants.initialTableInset) } UIView.addKeyframe(withRelativeStartTime: tableFadeAnimationPortion, relativeDuration: controlsFadeAnimationPortion) { self.callControls.alpha = 1 @@ -404,7 +402,7 @@ class CallDrawerSheet: InteractiveSheetViewController { let stepSize = HeightConstants.initialTableInset / totalTravelableDistanceForSheet // How far the table should have traveled. let tableTravelDistance = stepSize * distanceTraveledBySheetSoFar - self.tableViewTopConstraint?.constant = HeightConstants.initialTableInset - tableTravelDistance + self.setTableViewTopTranslation(to: HeightConstants.initialTableInset - tableTravelDistance) } else if height >= maxHeight { changesForSnapToMax() } @@ -435,8 +433,7 @@ class CallDrawerSheet: InteractiveSheetViewController { } UIView.addKeyframe(withRelativeStartTime: controlsFadeAnimationPortion, relativeDuration: tableFadeAnimationPortion) { self.tableView.alpha = 1 - self.tableViewTopConstraint?.constant = 0 - self.view.layoutIfNeeded() + self.setTableViewTopTranslation(to: 0) } } }