問題
iOS16対応のためXcode14でアプリをビルドするとNavigatoinBarのタイトルが消えていた...
結論
navigationItem.title
じゃなくて
navigationItem.titleView
を使う
調べたこと
-
navigationItem.title
でタイトルを設定していたので、値が入っているかブレイクポイントを置いて確認したところちゃんと入っていた。 - Debug View Hierarchyで確認したところ、タイトルが設定されていることは確認できたが透明になっているか何かでやはり表示されていなかった。
対応方法
① navigationItem.titleView
を使用し、制約をつけたUILabelを設定する。
② ①を全てのViewControllerで行うのは大変なのでUIViewControllerのextensionを作成し、各ViewControllerで呼び出す
extension UIViewController {
func setNavigationTitle(title: String) {
// Label生成
let titleLabel = UILabel()
titleLabel.text = title
// サイズと制約
titleLabel.sizeToFit()
titleLabel.translatesAutoresizingMaskIntoConstraints = false
if let navigationBarHeight = navigationController?.navigationBar.bounds.height {
titleLabel.heightAnchor.constraint(equalToConstant: navigationBarHeight).isActive = true
}
titleLabel.widthAnchor.constraint(lessThanOrEqualToConstant: titleLabel.bounds.width).isActive = true
// titleを設定
self.navigationItem.titleView = titleLabel
}
}
ここで少し意識しないといけないのはこの部分
titleLabel.widthAnchor.constraint(lessThanOrEqualToConstant: titleLabel.bounds.width).isActive = true
lessThanOrEqualToConstant
にすることでNavigationBarに他のItemがある場合もそれらが隠れない幅になります。
override func viewDidLoad() {
super.viewDidLoad()
self.setNavigationTitle(title: "hoge")
}
あとはこんな感じでviewDidLoad()などタイトルを設定したいタイミングで呼ぶだけ
補足
UILabelを設定していますが、UIImageViewを設定すれば画像にも対応できます。
そして記事執筆時まだbetaなのでなおるかも...