Показывать панель поиска на панели навигации и большой заголовок также без прокрутки на iOS 13 - PullRequest
0 голосов
/ 06 ноября 2019

Я присоединяю UISearchController к navigationItem.searchController на iOS 13. Это прекрасно работает: я могу использовать красивую панель поиска в стиле iOS 13.

Однако я бы хотел увидетьбольшие заголовки и панель поиска по умолчанию.

Я установил navigationItem.hidesSearchBarWhenScrolling = false, потому что я хочу, чтобы поиск постоянно отображался на моем экране, но панель поиска заменяет большие заголовки по умолчанию.

Кто-нибудь знает, какэто возможно?

Проверьте это

navigationItem.searchController = UISearchController(searchResultsController: nil)
navigationItem.hidesSearchBarWhenScrolling = false

Вот как это выглядит на самом деле This is how it looks actually

Вот как мне нужно реализовать (видны большой заголовок и строка поиска) This is how I need to implement(large title and search bar both visible)

1 Ответ

0 голосов
/ 06 ноября 2019

Попробуйте, отлично работает у меня на стороне

    private var search = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()
        search.searchBar.delegate = self
        search.searchBar.sizeToFit()
        search.obscuresBackgroundDuringPresentation = false
        search.hidesNavigationBarDuringPresentation = true
        self.definesPresentationContext = true
        search.searchBar.placeholder = "Search here"
        self.navigationItem.searchController = search
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationItem.hidesSearchBarWhenScrolling = false
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationItem.hidesSearchBarWhenScrolling = true
    }

Для большой панели навигации используйте эту

Для полной поддержки панели навигации приложения, пожалуйста, добавьте это расширение в свой код.

import UIKit
extension UIViewController {


    open func showNavigationBar(_ large: Bool,
                                _ animated: Bool,
                                titleColor: UIColor,
                                barTintColor: UIColor,
                                fontSize: CGFloat) {

        navigationController?.navigationBar.barTintColor = barTintColor
        navigationController?.navigationBar.backgroundColor = barTintColor
        navigationController?.navigationBar.isTranslucent = true
        self.navigationController?.setNavigationBarHidden(false, animated: animated)
        if large {
            self.navigationController?.navigationBar.prefersLargeTitles = true
            if #available(iOS 13.0, *) {
                let appearance = UINavigationBarAppearance()
                appearance.backgroundColor = barTintColor
                appearance.titleTextAttributes = [.foregroundColor: titleColor]
                appearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
                                                       NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!]

                navigationController?.navigationBar.standardAppearance = appearance
                navigationController?.navigationBar.compactAppearance = appearance
                navigationController?.navigationBar.scrollEdgeAppearance = appearance
            } else {
                self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
                                                                                     NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!]
            }
        } else {
            self.navigationController?.navigationBar.prefersLargeTitles = false
            self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
                                                                            NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: 20.0)!]
        }
    }
}

И затем вызовите этот метод просто

self.showNavigationBar(true, true, titleColor: UIColor.blue, barTintColor: UIColor.red, fontSize: 32.0)

Если затем также не работает, используйте это

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        search.searchBar.becomeFirstResponder()
    }

Еще одно решение - добавить один UIView с высотой0 в раскадровке и телеприставке с безопасной областью и нижней частью с UIScrollView / UICollectionView / UITableVIew или чем-то еще с возможностью прокрутки и удаления прямой зависимости между TopSafeArea и ScrollableView Top. Я знаю, может быть, это не решение, но я сделал это в раскадровке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...