From 11ade8e54b98a58b3e1c70ce41c2b6f22bdf43c3 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Wed, 24 May 2023 16:19:58 -0500 Subject: [PATCH] Fixes AppViewController scrolling performance for apps with several privacy permissions --- AltStore/Components/CollapsingTextView.swift | 54 +++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/AltStore/Components/CollapsingTextView.swift b/AltStore/Components/CollapsingTextView.swift index 8ffef7a3..fb995221 100644 --- a/AltStore/Components/CollapsingTextView.swift +++ b/AltStore/Components/CollapsingTextView.swift @@ -12,18 +12,23 @@ class CollapsingTextView: UITextView { var isCollapsed = true { didSet { + guard self.isCollapsed != oldValue else { return } + self.shouldResetLayout = true self.setNeedsLayout() } } var maximumNumberOfLines = 2 { didSet { + self.shouldResetLayout = true self.setNeedsLayout() } } var lineSpacing: Double = 2 { didSet { + self.shouldResetLayout = true + if #available(iOS 16, *) { self.updateText() @@ -37,6 +42,8 @@ class CollapsingTextView: UITextView override var text: String! { didSet { + self.shouldResetLayout = true + guard #available(iOS 16, *) else { return } self.updateText() } @@ -44,6 +51,9 @@ class CollapsingTextView: UITextView let moreButton = UIButton(type: .system) + private var shouldResetLayout: Bool = false + private var previousSize: CGSize? + override init(frame: CGRect, textContainer: NSTextContainer?) { super.init(frame: frame, textContainer: textContainer) @@ -105,38 +115,44 @@ class CollapsingTextView: UITextView height: font.lineHeight) self.moreButton.frame = moreButtonFrame - if self.isCollapsed + if self.shouldResetLayout || self.previousSize != self.bounds.size { - self.textContainer.maximumNumberOfLines = self.maximumNumberOfLines - - let boundingSize = self.attributedText.boundingRect(with: CGSize(width: self.textContainer.size.width, height: .infinity), options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil) - let maximumCollapsedHeight = font.lineHeight * Double(self.maximumNumberOfLines) - - if boundingSize.height.rounded() > maximumCollapsedHeight.rounded() + if self.isCollapsed { - var exclusionFrame = moreButtonFrame - exclusionFrame.origin.y += self.moreButton.bounds.midY - exclusionFrame.size.width = self.bounds.width // Extra wide to make sure it wraps to next line. - self.textContainer.exclusionPaths = [UIBezierPath(rect: exclusionFrame)] + self.textContainer.maximumNumberOfLines = self.maximumNumberOfLines - self.moreButton.isHidden = false + let boundingSize = self.attributedText.boundingRect(with: CGSize(width: self.textContainer.size.width, height: .infinity), options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil) + let maximumCollapsedHeight = font.lineHeight * Double(self.maximumNumberOfLines) + + if boundingSize.height.rounded() > maximumCollapsedHeight.rounded() + { + var exclusionFrame = moreButtonFrame + exclusionFrame.origin.y += self.moreButton.bounds.midY + exclusionFrame.size.width = self.bounds.width // Extra wide to make sure it wraps to next line. + self.textContainer.exclusionPaths = [UIBezierPath(rect: exclusionFrame)] + + self.moreButton.isHidden = false + } + else + { + self.textContainer.exclusionPaths = [] + + self.moreButton.isHidden = true + } } else { + self.textContainer.maximumNumberOfLines = 0 self.textContainer.exclusionPaths = [] self.moreButton.isHidden = true } - } - else - { - self.textContainer.maximumNumberOfLines = 0 - self.textContainer.exclusionPaths = [] - self.moreButton.isHidden = true + self.invalidateIntrinsicContentSize() } - self.invalidateIntrinsicContentSize() + self.shouldResetLayout = false + self.previousSize = self.bounds.size } }