赤い大きなタイトルでUINavigationBar
を使用する必要があるという要件があります。
現在、私は次のコードを持っています:
func prepareNavigationController() {
let navController = UINavigationController(rootViewController: self)
navController.navigationBar.prefersLargeTitles = true
navigationItem.searchController = UISearchController(searchResultsController: nil)
navigationItem.hidesSearchBarWhenScrolling = false
navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.red]
}
しかし、実際にはタイトルラベルを赤に染めているわけではありません。これが結果です:
ただし、prefersLargeTitles
をfalseに変更すると正しいことが行われ、タイトルが赤になります。
navController.navigationBar.prefersLargeTitles = false
この記事の執筆時点ではまだ最初のベータ版であるため、これがバグかどうか、またはこれが意図的な動作であるかどうかは、主にAppleのアプリのいずれも大きなタイトルを色付けしていないためです。大きなタイトルを実際に好きな色にする方法はありますか?
これに役立つ新しいUINavigationBarプロパティ「largeTitleTextAttribute」があります。
以下は、View ControllerのviewDidLoadメソッドに追加できるサンプルコードです
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue]
以下は、largeTitleTextAttributesが設定されていないサンプルコードとスクリーンショットですが、barStyleは.blackに設定されています
navigationController?.navigationBar.barStyle = .black
これは、largeTitleTextAttributesが設定されていないスクリーンショットですが、barStyleは.defaultに設定されています
navigationController?.navigationBar.barStyle = .default
ベータ1と2のバグかどうかはわかりませんが、色を設定する方法は次のとおりです。これは少し「ハッキング」な回避策ですが、Appleがこれを修正するまで動作するはずです。Objective-CとSwiftバージョンの両方で、このコードはの中に viewDidAppear:
方法。
Objective-C:
dispatch_async(dispatch_get_main_queue(), ^{
for (UIView *view in self.navigationController.navigationBar.subviews) {
NSArray <__kindof UIView *> *subviews = view.subviews;
if (subviews.count > 0) {
UILabel *label = subviews[0];
if (label.class == [UILabel class]) {
[label setTextColor:[UIColor redColor]];
}
}
}
});
迅速:
DispatchQueue.main.async {
for view in self.navigationController?.navigationBar.subviews ?? [] {
let subviews = view.subviews
if subviews.count > 0, let label = subviews[0] as? UILabel {
label.textColor = UIColor.red
} } }
IOS 13でこれを行う方法が変更され、次のようにUINavigationBarAppearance
クラスを使用するようになりました…
let appearance = UINavigationBarAppearance(idiom: .phone)
appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.titleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.backgroundColor = .white
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
IOS11以降と古いiOSバージョンの両方で、大きなタイトルを使用し、小さなタイトルと大きなタイトルのテキストの色を白に設定するための作業コードを次に示します。
// Will apply to versions before iOS 11
navigationController?.navigationBar.titleTextAttributes = [
NSAttributedStringKey.foregroundColor: UIColor.white
]
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationBar.largeTitleTextAttributes = [
NSAttributedStringKey.foregroundColor: UIColor.white
]
}
(Xcodeにバグがあったが、現在は修正されているように見える)