Skip to content

Instantly share code, notes, and snippets.

@benpackard
Last active November 10, 2018 18:18
Show Gist options
  • Save benpackard/16d15caf2e09601efce6b3c0f9038160 to your computer and use it in GitHub Desktop.
Save benpackard/16d15caf2e09601efce6b3c0f9038160 to your computer and use it in GitHub Desktop.
A `UINavigationController` that adjusts the font size of its large title labels to fit its content
import UIKit
/// A `UINavigationController` that adjusts the font size of its large title labels to fit its content
class TitleSizeAdjustingNavigationController: UINavigationController {
var minimumScaleFactor: CGFloat = 0.5
override func viewDidLayoutSubviews() {
guard navigationBar.prefersLargeTitles else { return }
updateLargeTitleLabels()
}
private func updateLargeTitleLabels() {
largeTitleLabels().forEach {
$0.adjustsFontSizeToFitWidth = true
$0.minimumScaleFactor = minimumScaleFactor
}
}
private func largeTitleLabels() -> [UILabel] {
let subviews = recursiveSubviews(of: navigationBar)
let labels = subviews.compactMap { $0 as? UILabel }
let titles = viewControllers.compactMap { $0.title }
let titleLabels = labels.filter {
if let text = $0.text, titles.contains(text) {
return true
}
return false
}
// 'large' title labels are identified by comparing font size
let titleLabelFontSizes = titleLabels.map { $0.font.pointSize }
let largeTitleLabelFontSize = titleLabelFontSizes.max()
let largeTitleLabels = titleLabels.filter { $0.font.pointSize == largeTitleLabelFontSize }
return largeTitleLabels
}
private func recursiveSubviews(of view: UIView) -> [UIView] {
var result = [UIView]()
for subview in view.subviews {
result.append(subview)
result += recursiveSubviews(of: subview)
}
return result
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment