web-dev-qa-db-ja.com

iOS 11の大きなタイトルのナビゲーションバーが崩壊しない

Cocoa Touch WWDCビデオの新機能のAppleの人は、新しい大型タイトルナビゲーションバーが基本ビューの最上位のスクロールビューに魔法のように接続されると言いました コントローラーを上下にスクロールしながら自動的に折りたたみ/展開します。 (そして、「魔法のように」、おそらく彼は、この機能を既に恥ずかしいUINavigationController-UINavigationBar-UINavigationitem AP​​Iに使用可能な方法でパッチすることに失敗したことを意味したので、背後でヒューリスティックに選択されたスクロールビューに接続します)

基本的なUINavigationController + UITableView/UICollectionViewセットアップからわずかに逸脱すると、この「自動」折りたたみ/展開が機能しないことを準備していましたが、これでも最も単純な場合、期待どおりに動作しません。

ここに私が持っているものがあります:

UITabBarControllerを含むUINavigationControllerを含むUIViewControllerを含むUITableViewを含むview。テーブルの最初のセルをタップすると、ナビゲーションスタックの2番目のビューコントローラーがプッシュされます。

storyboard

コードなし、ストーリーボードのみ。

ナビゲーションバーの大きなタイトルをアクティブにするために、 "大きなタイトルを優先する"をチェックしました。ここで、アプリを実行してテーブルビューを上下にスクロールすると、ナビゲーションバーは同じ(大きな)サイズのままです。それは崩壊しません:

stuck with large title

ただし、2番目のView Controllerのナビゲーションアイテムを設定して、小さなナビゲーションバーを使用すると( "Large Title"の値を設定することで、 "Never")、そのページを開いて戻ると、最初のページでインタラクティブな折りたたみが魔法のように動作し始めます:

interactive collapse works after back navigation

ここに何か不足していますか、またはこの機能は正常に動作していませんか?私が使用しているサンプルプロジェクトは次のとおりです。 https://github.com/tzahola/iOS-11-Large-Title-Navigation-Bar

ところで、ベータ版ではなく、公式にリリースされたiOS 11を使用しています。

2017-09-23更新:Appleにバグレポートを送信し、openradar.meでチケットを開きました: http://www.openradar.me/radar?id = 5017601935671296

41
Tamás Zahola

良いニュースです!ストーリーボードで "Large Titles" "Never"に設定してから設定すると、コードを介して、それは動作します:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;
}

Appleは、ナビゲーションアイテムのlargeTitleDisplayModeがInterface Builderを介して設定されている場合の処理​​を忘れていたようです。

この問題が解決するまで、ストーリーボード上で "大タイトル" "Never"のままにして、viewDidLoadのコードで設定します。 。

最初のView Controllerに対して行う必要があります。後続のView Controllerは、ストーリーボードの値を尊重します。

24
Tamás Zahola

TableViewに加えて他のビューがある場合は、tableViewがそのビューの最上部、セーフエリアのすぐ下にあることも確認してください。

enter image description here

14
kamil3

または、ストーリーボードで何かを変更する代わりに、これを行います:

override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 11.0, *) {
        self.navigationItem.largeTitleDisplayMode = .never
        self.navigationItem.largeTitleDisplayMode = .always
    }
}

どの言語でも!

これは、ナビゲーションアイテムの大きなタイトルが、前の画面ナビゲーションアイテムのタイトルの大きなタイトルの動作に基づいて折りたたむかどうかを決定するためです。

10
D4ttatraya

コメントできないので、投稿した回答をここで共有します

https://stackoverflow.com/a/47493375/8385022

基本的にこのサイトで回避策を見つけました。tableView(またはスクロールのある要素)がビュー階層の最初のビューでない場合、大きなタイトルは自動的に非表示になりません。

動作しない例動作する例

https://markusbodner.com/2017/10/08/fix-large-navigation-bar-title-not-hiding-on-scroll-in-ios-11/

WillAppearビューに追加しました:

        if #available(iOS 11.0, *) {
        navigationController?.navigationBar.prefersLargeTitles = true
    } else {
        // Fallback on earlier versions
    }
5
Sergio Trejo

Replying to @sakuya__

みんな私も同じ問題を抱えていた。 Navigation Controllerの最初のView Controllerに次のスニペットを追加することで、この問題を解決できました

navigationController?.navigationBar.prefersLargeTitles = true
1
satish