Fixes AppViewController scrolling performance for apps with several privacy permissions

This commit is contained in:
Riley Testut
2023-05-24 16:19:58 -05:00
committed by Magesh K
parent a3c373108d
commit 0d79a01d74

View File

@@ -12,18 +12,23 @@ final class CollapsingTextView: UITextView
{ {
var isCollapsed = true { var isCollapsed = true {
didSet { didSet {
guard self.isCollapsed != oldValue else { return }
self.shouldResetLayout = true
self.setNeedsLayout() self.setNeedsLayout()
} }
} }
var maximumNumberOfLines = 2 { var maximumNumberOfLines = 2 {
didSet { didSet {
self.shouldResetLayout = true
self.setNeedsLayout() self.setNeedsLayout()
} }
} }
var lineSpacing: Double = 2 { var lineSpacing: Double = 2 {
didSet { didSet {
self.shouldResetLayout = true
if #available(iOS 16, *) if #available(iOS 16, *)
{ {
self.updateText() self.updateText()
@@ -37,6 +42,8 @@ final class CollapsingTextView: UITextView
override var text: String! { override var text: String! {
didSet { didSet {
self.shouldResetLayout = true
guard #available(iOS 16, *) else { return } guard #available(iOS 16, *) else { return }
self.updateText() self.updateText()
} }
@@ -44,6 +51,9 @@ final class CollapsingTextView: UITextView
let moreButton = UIButton(type: .system) let moreButton = UIButton(type: .system)
private var shouldResetLayout: Bool = false
private var previousSize: CGSize?
override init(frame: CGRect, textContainer: NSTextContainer?) override init(frame: CGRect, textContainer: NSTextContainer?)
{ {
super.init(frame: frame, textContainer: textContainer) super.init(frame: frame, textContainer: textContainer)
@@ -105,38 +115,44 @@ final class CollapsingTextView: UITextView
height: font.lineHeight) height: font.lineHeight)
self.moreButton.frame = moreButtonFrame self.moreButton.frame = moreButtonFrame
if self.isCollapsed if self.shouldResetLayout || self.previousSize != self.bounds.size
{ {
self.textContainer.maximumNumberOfLines = self.maximumNumberOfLines if self.isCollapsed
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 self.textContainer.maximumNumberOfLines = self.maximumNumberOfLines
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 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 else
{ {
self.textContainer.maximumNumberOfLines = 0
self.textContainer.exclusionPaths = [] self.textContainer.exclusionPaths = []
self.moreButton.isHidden = true 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
} }
} }