prefersLargeTitles с представлением GroupedListStyle SwiftUI - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть родительское представление, где я хочу, чтобы заголовок навигации был большим. Затем я пу sh дочерний вид с сгруппированным табличным представлением, и я хочу, чтобы заголовок навигации был inline:

Это хорошо работает с SwiftUI, но когда мой родитель является UIViewController с prefersLargeTitles = true, и я pu sh a UIHostingController(rootView: ChildView()) заголовок панели навигации в дочернем элементе прыгает

Вот ожидаемое поведение (только с использованием SwiftUI)

enter image description here

Вот поведение при нажатии из UIKit:

enter image description here

Это код SwiftUI, который работает

struct ParentView: View {
    var body: some View {
        NavigationView {
            Text("SwiftUI")
                .navigationBarItems(trailing: navigationButton)
                .navigationBarTitle("SwiftUI Parent", displayMode: .large)
        }
    }

    var navigationButton: some View {
        NavigationLink(destination: ChildView()) {
            Text("Push")
        }
    }
}

struct ChildView: View {
    let list = ["One", "Two", "Three"]
    var body: some View {
        List(list, id: \.self, rowContent: Text.init)
            .listStyle(GroupedListStyle())
            .navigationBarTitle("SwiftUI Child", displayMode: .inline)
    }
}

struct ChildView_Previews: PreviewProvider {
    static var previews: some View {
        ChildView()
    }
}

И как я пу sh SwiftUI ребенок от UIKit

class ParentViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "UIKit Parent"

        let barItem = UIBarButtonItem(title: "Push", style: .plain, target: self, action: #selector(pushChild))
        navigationItem.rightBarButtonItem = barItem
        view.backgroundColor = UIColor.systemBackground
        navigationController?.navigationBar.prefersLargeTitles = true
    }

    @objc
    func pushChild(_ sender: Any) {
        let childViewController = UIHostingController(rootView: ChildView())
        navigationController?.pushViewController(childViewController, animated: true)

    }
}

1 Ответ

0 голосов
/ 17 апреля 2020

Установите для дочернего контроллера navigationItem.largeTitleDisplayMode значение .never до его нажатия (даже если это UIHostingController).

func pushChild(_ sender: Any) {
    let childViewController = UIHostingController(rootView: ChildView())
    childViewController.navigationItem.largeTitleDisplayMode = .never
    navigationController?.pushViewController(childViewController, animated: true)
}
...