web-dev-qa-db-ja.com

iOS 11では、スクロールするまでLargeTitlesは更新されません

UINavigationControllerにラップされたUITableViewで基本的なUIViewControllerを実装しました。 prefersLargeTitlesをtrueに設定します。

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    navigationController?.navigationBar.prefersLargeTitles = true
    navigationItem.title = "Coffees"
}

ただし、ビューをスクロールするまでタイトルは小さくなり、その時点で拡大します。 UINavigationControllerを作成する場所にその呼び出しを移動しようとしましたが、効果はありませんでした。 prefersLargeTitlesを設定したとき、navigationControllerはnilでないと確信しています。

他の場所でそのプロパティを更新する必要がありますか?または、レーダーを提出する必要がありますか?

更新:

これは、ビューにUITableViewが含まれているか、それ自体がUITableViewControllerである場合にのみ発生するようです。

26
John Breen

同じ問題がありました。ストーリーボードは使用していませんが、これが誰かの助けになることを願っています。 TableViewControllerを埋め込んだNavigation Controller(View Controllerではなく)の「Preferred Large Titles」にチェックマークを付けました。NavigationControllerがすべてのView Controllerになった後、大きなタイトルがあり、動作するはずです。

19
Paco Wong

私は1つのテーブルビューでのみ同じ問題を抱えていました...

私は設定する必要がありました:

self.tableView.contentInsetAdjustmentBehavior = .never

そのため、uiviewcontrollerが読み込まれたときに、tableviewのスクロールが停止します。

大きなタイトルを非表示にするのは、TableViewの自動スクロールです

お役に立てれば

11
user1523505

私は最近同じ問題にぶつかりましたが、どの提案もうまくいきませんでした。代わりに、sizeToFit()を呼び出すだけでした。サンプルコード:

private func configureNavigator() {
    guard let navigationController = navigationController else { return }
    navigationController.navigationBar.prefersLargeTitles = true
    navigationItem.largeTitleDisplayMode = .automatic
    navigationController.navigationBar.sizeToFit()
}

これがお役に立てば幸いです!

8
titusmagnus

_top:1_を使用してtableViewのcontentInsetを変更すると、NavigationBarが展開されて大きなタイトルが表示されます。

Obj-C

_-(void) viewWillAppear:(BOOL)animated {
    if (@available(iOS 11.0, *)) {
        tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0);
    }
}
_

Swift

_override func viewWillAppear(_ animated: Bool) {
    if #available(iOS 11.0, *) {
        tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0)
    }
}
_

注:viewWillAppeartableView.reloadData()がある場合は、contentInsetを編集した後に呼び出してください。

4
Pau Senabre

私の場合、解決策は、SuperViewではなく、tableViewの上部をセーフエリアに合わせることでした

4
Arnaud Dorgans

prefersLargeTitle sagaが一部のView Controllerで予想どおりに動作し、一部のView Controllerでは上記と同じ問題が発生するため、これにかなりの時間を費やしました。

私にとっての解決策は、IBのトップバーの下にある拡張エッジのチェックを外すことでした-テーブルビューのコンテンツがロードされ、ナビゲーションバーが通常のサイズに戻るまで大きなタイトルを一時的に表示するView Controllerの場合テーブルビューを下にスクロールすると、大きなタイトルのみが表示されます。

これはiOS 10との後方互換性があり、Table Viewの最初の行の上に空のスペースを残しません。

IBでのみNavigation Controllerの属性インスペクターでprefersLargeTitleをチェックしました-コードには何もありません。 largeTitleDisplayMode = .alwaysにも同じ

一部のView Controllerでこれが発生し、他のView Controllerでは発生しない理由については、まったくわかりません。

2
Ahmed Khedr

私はちょうどこの同じ問題を抱えていましたが、私の場合、iOS 10でSwift 3(およびSwift 3)は、iOS 11でSwift 4。

詳しく説明するには:

ストーリーボードに、UINavigationControllerサブクラスに設定した通常のUIViewControllerがありました(私の階層はUITabBarControllerサブクラス→UINavigationControllerサブクラス→UITableViewControllerサブクラスで、あなたのものに似ています)。

IOS 10では、これは正常に機能しました。

IOS 11では、既存のSwift 3アプリを実行するときにも正常に機能します。

ただし、Swift 4アプリ、iOS 11で実行中)では、説明したのと同じ症状が見られました(大きなタイトルは、ビューをプルダウン/スクロールしたときにのみ表示されます)。

修正するために、StoryboardのUIViewControllerベースの要素を、実際のUINavigationControllerインスタンス(Storyboardに明示的にUINavigationBarを含む)に置き換えました。 Storyboard内で明示的に宣言された要素)。

とにかく、それは私のために問題を修正しました。

これはSwift 4ベースの回帰のように見えるので、レーダーを提出します。私にとっては、iOS 10でSwift 3とiOS 11 Swift 3。

1
Aral Balkan

navigationBarの動作の一般的な変更は、viewWillAppear(_:)で行う必要があります

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = true
}

それをした後、それは私のためにうまくいった。

1
BilalReffas

プログラム的に:

  1. AppDelegate.Swiftで:

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()
    
    let navigationController = UINavigationController.init(rootViewController: ViewController())
    window?.rootViewController = navigationController
    
  2. ViewControllerで:

    func viewWillAppear(_ animated:Bool){super.viewWillAppear(animated)をオーバーライドします。

    navigationController?.navigationBar.prefersLargeTitles = true
    navigationItem.largeTitleDisplayMode = .automatic
    

    }

    func loadView()をオーバーライドします{super.loadView()

    view.addSubview(tableView)
    view.addSubview(loadingView)
    
    NSLayoutConstraint.activate([
        tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
        tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
        tableView.widthAnchor.constraint(equalTo: view.safeAreaLayoutGuide.widthAnchor),
        tableView.heightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.heightAnchor)
        ])
    

    }

テーブルビューがビューに追加されていることを確認してくださいAT最初に!

1

私はそれが少しダミーに見えると思いますが、私はこれで問題を効果的に解決しました:

self.navigationItem.Prompt = ""

self.navigationItem.Prompt = nil

レイアウトを更新するには、navigationBarの要素の1つで一種の更新が必要なようです。

時々navigationBarで何かを更新するには、非表示と非表示を解除する必要があります。だからこそ、それを行うための最良の方法があると思うのです。

1

ストーリーボードで、ナビゲーションアイテムのLarge TitleからNeverへ。

Navigation Item

私のViewControllerのviewDidLoadメソッドでは、次を設定します:

navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
1
assb10yr

私は同じ問題にぶつかり、それを設定するView ControllerまたはオブジェクトからprefersLargeTitlesプロパティを設定し、それが提示される前に設定するのが通常最善であることがわかりました。

たとえば、問題のView Controllerがアプリの起動時に表示される場合:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let window = UIWindow(frame: UIScreen.main.bounds)

    let someViewController: UIViewController = CustomViewController()

    let theNavController = UINavigationController(rootViewController: someViewController)
    theNavController.navigationBar.prefersLargeTitles = true

    window.rootViewController = theNavController
    window.makeKeyAndVisible()

    return true
}

または、特定のView Controllerを提示する場合:

let someViewController: UIViewController = CustomViewController()

let theNavController = UINavigationController(rootViewController: someViewController)
theNavController.navigationBar.prefersLargeTitles = true

present(theNavController, animated: true, completion: nil)

このメソッドは、ナビゲーションタイトルがそれに応じて表示されるようにするための、より確実な方法であることがわかりました。お役に立てれば! :)

1
gomollon

ストーリーボードでこの問題を解決しました

  1. Navigation Controller-> Navigation Bar->属性インスペクター->大きいタイトルを優先する(チェックあり)
  2. View Controller-> Navigation Item-> Attributes inspector-> Large Title(自動または常にチェックされている)
1
yoAlex5

UITableViewControllerUIViewControllerが追加された同様の問題。私のインスタンスでは、これらのView Controller自体がUITabBarControllerに埋め込まれており、正しく表示される最初のタブのみが大きなタイトルを使用していました。他のタブでは、大きなタイトルを表示する前に手動でスクロールする必要がありました。

私が仕事に着くことができたのは、contentInsetインセットが役に立たなかったことを除いて、@ [pau-senabre]の答えに従ってtopを調整することだけでした。代わりに、leftインセットを設定し、次のランループでリセットします。

private var isFirstAppearance = true

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if isFirstAppearance {
        applyLargeTitlesFix()
    }
}

private func applyLargeTitlesFix() {
    let originalInset = tableViewController.tableView.contentInset
    tableViewController.tableView.contentInset = UIEdgeInsets(top: 0, left: 1, bottom: 0, right: 0)
    DispatchQueue.main.async { [weak self] in
        self?.tableViewController.tableView.contentInset = originalInset
    }
    isFirstAppearance = false
}
0
Ben Packard

同様の問題がありました。ビューはテーブルビューです。 prefersLargeTitlesのプロパティは、viewDidLoadイベントで設定されます。次に、viewWillAppearイベントでビューのタイトルを設定します。

override open func viewDidLoad() {
   if #available(iOS 11.0, *) {
        self.navigationController?.navigationBar.prefersLargeTitles = true
    } else {
        // Fallback on earlier versions
    }
    ...
}

override open func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "something"
    ...
}

準備セグエイベントでは、ナビゲーションアイテムのタイルをnilに設定して、次のビューの左側のナビゲーションvarアイテムに「戻る」が自動的に表示されるようにします。

override func prepare(for segue: UIStoryboardSegue,
                      sender: Any?) {
    self.navigationItem.title = nil
    ...
}

初めてテーブルビューに大きなタイトルが正しく表示されます。ただし、次のビューに行を選択してテーブルビューに戻ると、ナビゲーションアイテムのタイトルが空になります。

数時間の苦労の末、ビューのタイトルをviewDidAppearイベントで設定する必要があることがようやくわかりました! Willイベントでビューのタイトルに設定されたものは、UIKitによって内部的にリセットされ、nilに戻ります。そのため、別のイベントで設定する必要があります。

override func viewDidAppear(_ animated: Bool) {
   self.navigationItem.title = "something"
   ...
}

override open func viewWillAppear(_ animated: Bool) {
    // self.navigationItem.title = "something" // Remove it and set title in Did event!
    ...
}

このiOS 11の新機能を紹介する前に、アプリは正常に動作します。新機能にはUIKitにいくつかの変更が加えられているため、以前のバージョンのアプリを機能させるには更新/変更が必要になる場合があります。

0
David.Chu.ca

最初は奇妙な動作のように見えますが、navigationItem.largeTitleDisplayModeからalwaysへ。デフォルトはautomatic-であり、 docs でどのように機能するかは定義されていません。

また、大きなタイトルに関する回答を更新/更新します here

0
kgaidis

同じ問題があり、InterfaceBuilderのViewControllerでビューの順序を変更することで修正しました。

Hierarchyの最初のビューがScrollViewではない場合、NavigationBarはLargeTitleモードで表示され、スクロールビューと一緒にアニメーション化されないようです。スクロールを反映するナビゲーションバーのタイトルが必要な場合、ビュー階層の最初にスクロールビューを配置する必要があります。

また、これについては完全にはわかりませんが、標準モードまたは大タイトルモードでのナビゲーションバーの外観は、以前のコントローラーのビュー階層に依存しているようです。

0
egor

もう1つの解決策は、refreshHandler()でリフレッシュを終了することです。このような-

@objc func refreshPage() {
    self.refreshControl?.endRefreshing() //End here
    self.loadTableData() //Get fresh data and reload table
}
0
ManjunathK

ここでSwift 4.2、iOS 12、およびリファクタリングされたStoryboardsと同じ問題。

prefersLargeTitles = trueviewWillAppearおよびviewDidLoadに追加しようとしましたが、どちらも私の問題を修正しませんでした。

代わりに、リファクタリングされたストーリーボードをmain.storyboardにコピーして戻し、IBで大きなタイトルを有効にするオプションを見つけました。そのオプションを設定してから、ストーリーボードをリファクタリングして元に戻し、すべてが機能するようになりました。何らかの理由で、最初のリファクタリングではオプションが削除され、プログラムで有効にすることができませんでした。

0
Rami