私はそれがバグであるか、それが予想される動作であるかを理解しようとしています。
iOS 10以前では、navigationItem.titleView
を使用してカスタムタイトルを設定できました。
iOS 11で、navigationItem.largeTitleDisplayMode = .always
を設定してnavigationItem.titleView = <Some cool UIButton>
を設定すると、表示されます通常のナビゲーションタイトルバーと大きなナビゲーションタイトルの両方。
総括する:
大きなナビゲーションタイトルでカスタムtitleViewを使用するにはどうすればよいですか?
編集:これは期待される結果です:
UINavigationBar
のサブクラスを使用し、ビュー階層を手動で変更することで、ナビゲーションバーの大きなタイトルをカスタムビューに置き換えることができました。
@interface MYNavigationBar : UINavigationBar
@end
@implementation MYNavigationBar
// ...
- (void)layoutIfNeeded
{
[self setupTitle];
[super layoutIfNeeded];
}
- (void)setupTitle
{
// UINavigationBar
// -> ...
// -> _UINavigationBarLargeTitleView
// -> UILabel << Big Title Label
// -> UIView
// -> UILabel << Big Title Label animating from back button during transitions
for (UIView *view in self.subviews) {
NSString *className = NSStringFromClass(view.classForCoder);
if ([className containsString:@"LargeTitleView"]) {
for (UIView *view2 in view.subviews) {
if ([view2 isKindOfClass:[UILabel class]]) {
[self convertLabel:(UILabel *)view2];
}
for (UIView *view3 in view2.subviews) {
if ([view3 isKindOfClass:[UILabel class]]) {
[self convertLabel:(UILabel *)view3];
}
}
}
}
}
}
- (void)convertLabel:(UILabel*)label
{
// I kept the original label in the hierarchy (with the background color as text color)
// and added my custom view as a subview.
// This allow the transformations applied to the original label to be also applied to mine.
}
Apple mightこのトリックのためにアプリを拒否することに注意してください。
これに関するドキュメントが見つからないので、少し遊んでみました。 iOS 11では、そのタイトルをボタンにして左側に大きく表示することはできないようです。
これは新機能のようで、バグなのか期待される結果なのかわかりません。最新(iOS 11) ヒューマンインターフェイスガイドライン (HIG)は、ユーザーに明確なコンテキストを提供する方法として、より大きなタイトルラベルについて説明しています。 HIGは、ボタン間のスペースについても説明します。ただし、ボタンをタイトルとして使用することについての説明はありません。
再作成するために、シングルビュープロジェクトを設定しました。ビューコントローラーをナビゲーションコントローラーに埋め込みました。
ViewController.Swift
のviewDidLoad
、私はこのコードを追加しました:
let titleButton = UIButton(type: .roundedRect)
titleButton.setTitle("Hello Button!", for: UIControlState.normal)
let navController = parent as! UINavigationController
navController.navigationBar.topItem!.title = "Hello???"
navController.navigationBar.topItem!.titleView = titleButton
navController.navigationBar.prefersLargeTitles = true
これはあなたの例のようになってしまいます。
IF I:
セットする .title
文字列を空にするか、行をコメントアウトします。navbarが引き伸ばされ、タイトルテキストが表示されません(またはInterface Builderで設定されたタイトルテキストが表示されます)
.prefersLargeTitles
、またはfalse
に設定します。navbarは通常の高さで、ボタンは表示されますが、タイトルテキストは表示されません。
titleView
行に注意し、AND:
.prefersLargeTitles
をtrue
に設定:title
テキストが左側に大きく表示され、ナビゲーションバーの高さが引き伸ばされます。.prefersLargeTitles
からfalse
:title
テキストが上部中央に表示され、ナビゲーションバーは通常の高さです。更新:へのリンク GitHubのサンプルプロジェクト