Я хочу, чтобы у моего приложения были большие заголовки, однако, когда пользователь прокручивает, я не хочу, чтобы отображалась обычная / обычная панель навигации. Я просто хочу, чтобы большой бар прокручивался вверх вместе с таблицей. Возможно ли это без создания пользовательских видов на панели навигации? Я сделал это успешно с пользовательскими представлениями, но это не так плавно, и поместить UISearchController внутрь - это боль.

func createNavController(vc: UIViewController, title: String, image: UIImage, tag: Int) -> UINavigationController {
    let navController = UINavigationController(rootViewController: vc)
    navController.navigationBar.prefersLargeTitles = true
    navController.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navController.navigationBar.shadowImage = UIImage()
    navController.navigationBar.tintColor = .headerColor
    navController.tabBarItem = UITabBarItem(title: title, image: image.withRenderingMode(.alwaysTemplate), tag: tag)
    navController.navigationBar.topItem?.title = title
    navController.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.headerColor, .font: UIFont.customHeaderFont(size: 25)]
    navController.navigationBar.largeTitleTextAttributes = [.foregroundColor: UIColor.headerColor, .font: UIFont.customHeaderFont(size: 40)]
//        let titleLabel = UILabel()
//        titleLabel.text = title
//        titleLabel.textColor = .headerColor
//        titleLabel.font = UIFont.customHeaderFont(size: navController.navigationBar.frame.height - 5)
//        navController.navigationBar.addSubview(titleLabel)
//        titleLabel.anchor(top: nil, left: navController.navigationBar.leftAnchor, bottom: nil, right: nil, paddingTop: 0, paddingLeft: 20, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
//        titleLabel.centerYAnchor.constraint(equalTo: navController.navigationBar.centerYAnchor).isActive = true
    return navController
}
1
Nick 7 Фев 2020 в 19:55

2 ответа

Лучший ответ

Используйте мое расширение iOS 13 Swift 5 протестировано

extension UIViewController {
func configureNavigationBar(largeTitleColor: UIColor, backgoundColor: UIColor, tintColor: UIColor, title: String, preferredLargeTitle: Bool) {
    if #available(iOS 13.0, *) {
        let navBarAppearance = UINavigationBarAppearance()
        navBarAppearance.configureWithOpaqueBackground()
        navBarAppearance.largeTitleTextAttributes = [.foregroundColor: largeTitleColor]
        navBarAppearance.titleTextAttributes = [.foregroundColor: largeTitleColor]
        navBarAppearance.backgroundColor = backgoundColor

        navigationController?.navigationBar.standardAppearance = navBarAppearance
        navigationController?.navigationBar.compactAppearance = navBarAppearance
        navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance

        navigationController?.navigationBar.prefersLargeTitles = preferredLargeTitle
        navigationController?.navigationBar.isTranslucent = false
        navigationController?.navigationBar.tintColor = tintColor
        navigationItem.title = title

    } else {
        // Fallback on earlier versions
        navigationController?.navigationBar.barTintColor = backgoundColor
        navigationController?.navigationBar.tintColor = tintColor
        navigationController?.navigationBar.isTranslucent = false
        navigationItem.title = title
    }
}}

Как пользоваться:

configureNavigationBar(largeTitleColor: .yourColor, backgoundColor: .yourColor, tintColor: .yourColor, title: "yuorTitle", preferredLargeTitle: true)

Установите строку состояния на основе ViewController ...... на NO в info.plist, если вы хотите легкий контент

Если вы не хотите, чтобы largeTitles установили его в false

Для прозрачного изменения navBar Appearance.configure WithOpaqueBackground () в:

navBarAppearance.configureWithDefaultBackground()
navigationController?.navigationBar.isTranslucent = true

В вызове установите цвет фона на .clear

ОБНОВЛЕНИЕ . Если вы хотите начать с контроллера навигации и больших заголовков на первом контроллере, не забудьте установить контроллер запуска в Scene Delegate следующим образом:

guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.makeKeyAndVisible()
let vC = UINavigationController(rootViewController: YourFirstViewController())
window?.rootViewController = vC

Надеюсь это поможет :)

1
Fabio 29 Мар 2020 в 06:51

Вы можете создать свой собственный навигационный контроллер и вызвать его в своих контроллерах представления; проще, настроить собственный контроллер навигации сложно, но вы можете сделать это, просматривая подпредставления в элементах native.

0
Edwin Rivas 7 Фев 2020 в 18:01