问题
I am using navigation controller, and I've set to true its navigation bar's prefersLargeTitle
property. Everything works fine, but when the text of my title becomes too big, it doesn't fit in space. Here how it looks:
Is it possible to somehow make the title (while the navigation bar's prefersLargeTitle
property is set to true) dynamically adjust its font size, and if it is so, how to achieve that?
回答1:
This question is somewhat answered here: How to resize Title in a navigation bar dynamically.
self.title = "Your TiTle Text"
let tlabel = UILabel(frame: CGRectMake(0, 0, 200, 40))
tlabel.text = self.title
tlabel.textColor = UIColor.whiteColor()
tlabel.font = UIFont(name: "Helvetica-Bold", size: 30.0)
tlabel.backgroundColor = UIColor.clearColor()
tlabel.adjustsFontSizeToFitWidth = true
self.navigationItem.titleView = tlabel
That being said, this is slightly different, in that you have the prefersLargeTitle property set.
Now, I am not sure whether the tlabel.adjustsFontSizeToFitWidth = true
overrides the prefersLargeTitle
property, but try it out and see if it works. There is also some additional information regarding navigation item large titles here: https://developer.apple.com/documentation/uikit/uinavigationitem/2909056-largetitledisplaymode. Hope this helps.
回答2:
This is the workaround that I found
override func viewDidLoad() {
super.viewDidLoad()
title = yourTitle
adjustLargeTitleSize()
}
extension UIViewController {
func adjustLargeTitleSize() {
guard let title = title, #available(iOS 11.0, *) else { return }
let maxWidth = UIScreen.main.bounds.size.width - 60
var fontSize = UIFont.preferredFont(forTextStyle: .largeTitle).pointSize
var width = title.size(withAttributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: fontSize)]).width
while width > maxWidth {
fontSize -= 1
width = title.size(withAttributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: fontSize)]).width
}
navigationController?.navigationBar.largeTitleTextAttributes =
[NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: fontSize)
]
}
}
回答3:
possible to use this somehow??
It's valid only in Interface Builder. but you CAN use it in runtime.
Autoshrink
Determines whether the label adjusts the appearance of the text before resorting to truncation. Choose Minimum Font Scale and enter a value to allow the label to reduce the font size to fit the text. Enable Tighten Letter Spacing to allow the label to reduce intercharacter spacing. Access these values at runtime with the
minimumScaleFactor
andallowsDefaultTighteningForTruncation
properties, respectively. Note that the Minimum Font Size option was deprecated in iOS 6.
source link
回答4:
Made an edit to @vicente.fava answer - this works great.
self.title = longTitle
self.navigationController?.navigationBar.prefersLargeTitles = true
adjustLargeTitleSize()
extension UIViewController {
func adjustLargeTitleSize() {
guard let title = title, #available(iOS 11.0, *) else { return }
let maxWidth = UIScreen.main.bounds.size.width - 60
var fontSize = UIFont.preferredFont(forTextStyle: .largeTitle).pointSize
var width = title.size(withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: fontSize)]).width
while width > maxWidth {
fontSize -= 1
width = title.size(withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: fontSize)]).width
}
navigationController?.navigationBar.largeTitleTextAttributes =
[NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: fontSize)
]
}
}
来源:https://stackoverflow.com/questions/47146606/my-navigation-bars-large-title-is-too-wide-how-to-fix-that