アプリケーションの 1 つのナビゲーション バーに大きなタイトルを追加しようとしています。問題は、タイトルが少し長いため、大きなタイトルに 2 行追加する必要があることです。ナビゲーション バーに 2 行の大きなタイトルを追加するにはどうすればよいですか?
これは、デフォルトのナビゲーション バーのタイトルに関するものではありません。iOS 11で導入された大型タイトルについてです。そのため、大きなタイトルを考慮して提案を追加してください。ありがとう
アプリケーションの 1 つのナビゲーション バーに大きなタイトルを追加しようとしています。問題は、タイトルが少し長いため、大きなタイトルに 2 行追加する必要があることです。ナビゲーション バーに 2 行の大きなタイトルを追加するにはどうすればよいですか?
これは、デフォルトのナビゲーション バーのタイトルに関するものではありません。iOS 11で導入された大型タイトルについてです。そのため、大きなタイトルを考慮して提案を追加してください。ありがとう
@krunalの回答に基づいて、これは私のために働いています:
extension UIViewController {
func setupNavigationMultilineTitle() {
guard let navigationBar = self.navigationController?.navigationBar else { return }
for sview in navigationBar.subviews {
for ssview in sview.subviews {
guard let label = ssview as? UILabel else { break }
if label.text == self.title {
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
label.sizeToFit()
UIView.animate(withDuration: 0.3, animations: {
navigationBar.frame.size.height = 57 + label.frame.height
})
}
}
}
}
UIViewController で:
override func viewDidLoad() {
super.viewDidLoad()
self.title = "This is a multiline title"
setupNavigationMultilineTitle()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
setupNavigationMultilineTitle()
}
大きなタイトルのフォントと色を設定するには:
navigation.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: .red, NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 30)]
戻るボタンがある場合、改行ソリューションは問題があるようです。そのため、改行する代わりに、ラベルの自動調整フォントを作成しました。
func setupLargeTitleAutoAdjustFont() {
guard let navigationBar = navigationController?.navigationBar else {
return
}
// recursively find the label
func findLabel(in view: UIView) -> UILabel? {
if view.subviews.count > 0 {
for subview in view.subviews {
if let label = findLabel(in: subview) {
return label
}
}
}
return view as? UILabel
}
if let label = findLabel(in: navigationBar) {
if label.text == self.title {
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.7
}
}
}
次に、ラベルが見つかることを確認するために viewDidLayoutSubviews() で呼び出す必要があります。これを呼び出す必要があるのは 1 回だけです。
private lazy var setupLargeTitleLabelOnce: Void = {[unowned self] in
if #available(iOS 11.0, *) {
self.setupLargeTitleAutoAdjustFont()
}
}()
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let _ = setupLargeTitleLabelOnce
}
このコントローラーに戻る何らかのナビゲーション コントローラー ポップ イベントがある場合は、viewDidAppear() で再度呼び出す必要があります。私はこれに対するより良い解決策を見つけていません - ポップイベントから戻ってきたときにラベルのフォントが変化するという小さな不具合があります:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if #available(iOS 11.0, *) {
setupLargeTitleAutoAdjustFont()
}
}
ここで、に複数行を追加できUILabel
ますNavigationTitle
。コードをカスタマイズしてUILabel
、self.navigationItem.titleView
let label = UILabel()
label.backgroundColor = .clear
label.numberOfLines = 2
label.font = UIFont(name: "Montserrat-Regular", size: 16.0)!
label.textAlignment = .center
label.textColor = .white
label.text = "FIFA" + " \n " + "Europe 2018-2019"
self.navigationItem.titleView = label