web-dev-qa-db-ja.com

iOS11-ラージタイトルモードを使用する場合のUINavigationItemtitleView

私はそれがバグであるか、それが予想される動作であるかを理解しようとしています。

iOS 10以前では、navigationItem.titleViewを使用してカスタムタイトルを設定できました。
iOS 11で、navigationItem.largeTitleDisplayMode = .alwaysを設定してnavigationItem.titleView = <Some cool UIButton>を設定すると、表示されます通常のナビゲーションタイトルバーと大きなナビゲーションタイトルの両方

イラスト: enter image description here

総括する:

大きなナビゲーションタイトルでカスタムtitleViewを使用するにはどうすればよいですか?

編集:これは期待される結果です:

enter image description here

10
Roi Mulia

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このトリックのためにアプリを拒否することに注意してください。

1
Axel Guilmin

これに関するドキュメントが見つからないので、少し遊んでみました。 iOS 11では、そのタイトルをボタンにして左側に大きく表示することはできないようです。

これは新機能のようで、バグなのか期待される結果なのかわかりません。最新(iOS 11) ヒューマンインターフェイスガイドライン (HIG)は、ユーザーに明確なコンテキストを提供する方法として、より大きなタイトルラベルについて説明しています。 HIGは、ボタン間のスペースについても説明します。ただし、ボタンをタイトルとして使用することについての説明はありません。


再作成するために、シングルビュープロジェクトを設定しました。ビューコントローラーをナビゲーションコントローラーに埋め込みました。

ViewController.SwiftviewDidLoad、私はこのコードを追加しました:

    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:

    • 出て .prefersLargeTitlestrueに設定:titleテキストが左側に大きく表示され、ナビゲーションバーの高さが引き伸ばされます。
    • をセットする .prefersLargeTitlesからfalsetitleテキストが上部中央に表示され、ナビゲーションバーは通常の高さです。

更新:へのリンク GitHubのサンプルプロジェクト

6
leanne