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
である場合にのみ発生するようです。
私は1つのテーブルビューでのみ同じ問題を抱えていました...
私は設定する必要がありました:
self.tableView.contentInsetAdjustmentBehavior = .never
そのため、uiviewcontrollerが読み込まれたときに、tableviewのスクロールが停止します。
大きなタイトルを非表示にするのは、TableViewの自動スクロールです
お役に立てれば
私は最近同じ問題にぶつかりましたが、どの提案もうまくいきませんでした。代わりに、sizeToFit()
を呼び出すだけでした。サンプルコード:
private func configureNavigator() {
guard let navigationController = navigationController else { return }
navigationController.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .automatic
navigationController.navigationBar.sizeToFit()
}
これがお役に立てば幸いです!
_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)
}
}
_
注:viewWillAppear
にtableView.reloadData()
がある場合は、contentInset
を編集した後に呼び出してください。
私の場合、解決策は、SuperViewではなく、tableViewの上部をセーフエリアに合わせることでした
prefersLargeTitle
sagaが一部のView Controllerで予想どおりに動作し、一部のView Controllerでは上記と同じ問題が発生するため、これにかなりの時間を費やしました。
私にとっての解決策は、IBのトップバーの下にある拡張エッジのチェックを外すことでした-テーブルビューのコンテンツがロードされ、ナビゲーションバーが通常のサイズに戻るまで大きなタイトルを一時的に表示するView Controllerの場合テーブルビューを下にスクロールすると、大きなタイトルのみが表示されます。
これはiOS 10との後方互換性があり、Table Viewの最初の行の上に空のスペースを残しません。
IBでのみNavigation Controllerの属性インスペクターでprefersLargeTitle
をチェックしました-コードには何もありません。 largeTitleDisplayMode = .always
にも同じ
一部のView Controllerでこれが発生し、他のView Controllerでは発生しない理由については、まったくわかりません。
私はちょうどこの同じ問題を抱えていましたが、私の場合、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。
navigationBar
の動作の一般的な変更は、viewWillAppear(_:)
で行う必要があります
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.prefersLargeTitles = true
}
それをした後、それは私のためにうまくいった。
プログラム的に:
AppDelegate.Swiftで:
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
let navigationController = UINavigationController.init(rootViewController: ViewController())
window?.rootViewController = navigationController
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最初に!
私はそれが少しダミーに見えると思いますが、私はこれで問題を効果的に解決しました:
self.navigationItem.Prompt = ""
self.navigationItem.Prompt = nil
レイアウトを更新するには、navigationBarの要素の1つで一種の更新が必要なようです。
時々navigationBarで何かを更新するには、非表示と非表示を解除する必要があります。だからこそ、それを行うための最良の方法があると思うのです。
ストーリーボードで、ナビゲーションアイテムのLarge Title
からNever
へ。
私のViewControllerのviewDidLoadメソッドでは、次を設定します:
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
私は同じ問題にぶつかり、それを設定する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)
このメソッドは、ナビゲーションタイトルがそれに応じて表示されるようにするための、より確実な方法であることがわかりました。お役に立てれば! :)
ストーリーボードでこの問題を解決しました
UITableViewController
にUIViewController
が追加された同様の問題。私のインスタンスでは、これらの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
}
同様の問題がありました。ビューはテーブルビューです。 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にいくつかの変更が加えられているため、以前のバージョンのアプリを機能させるには更新/変更が必要になる場合があります。
同じ問題があり、InterfaceBuilderのViewControllerでビューの順序を変更することで修正しました。
Hierarchyの最初のビューがScrollViewではない場合、NavigationBarはLargeTitleモードで表示され、スクロールビューと一緒にアニメーション化されないようです。スクロールを反映するナビゲーションバーのタイトルが必要な場合、ビュー階層の最初にスクロールビューを配置する必要があります。
また、これについては完全にはわかりませんが、標準モードまたは大タイトルモードでのナビゲーションバーの外観は、以前のコントローラーのビュー階層に依存しているようです。
もう1つの解決策は、refreshHandler()でリフレッシュを終了することです。このような-
@objc func refreshPage() {
self.refreshControl?.endRefreshing() //End here
self.loadTableData() //Get fresh data and reload table
}
ここでSwift 4.2、iOS 12、およびリファクタリングされたStoryboardsと同じ問題。
prefersLargeTitles = true
をviewWillAppear
およびviewDidLoad
に追加しようとしましたが、どちらも私の問題を修正しませんでした。
代わりに、リファクタリングされたストーリーボードをmain.storyboardにコピーして戻し、IBで大きなタイトルを有効にするオプションを見つけました。そのオプションを設定してから、ストーリーボードをリファクタリングして元に戻し、すべてが機能するようになりました。何らかの理由で、最初のリファクタリングではオプションが削除され、プログラムで有効にすることができませんでした。