在导航栏中显示搜索栏和大标题也无需在 iOS 13 上滚动

Bon*_*nke 13 uisearchcontroller large-title preferslargetitles ios13

我附加UISearchControllernavigationItem.searchControlleriOS上13这个工作得很好:我可以用最好的iOS的13式搜索栏。

但是,我希望默认情况下看到大标题和搜索栏。

我设置navigationItem.hidesSearchBarWhenScrolling = false是因为我想在我的屏幕上永久看到搜索,但默认情况下搜索栏会替换大标题。

有谁知道这怎么可能?

看一下这个

navigationItem.searchController = UISearchController(searchResultsController: nil)
navigationItem.hidesSearchBarWhenScrolling = false
Run Code Online (Sandbox Code Playgroud)

这是它的实际外观 这是它的实际外观

这就是我需要实现的方式(大标题和搜索栏都可见) 这就是我需要实现的方式(大标题和搜索栏都可见)

Kir*_*iya 1

试试这个,在我这边工作得很好

    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
    }
Run Code Online (Sandbox Code Playgroud)

对于大型导航栏,请使用此

要获得完整的应用程序导航栏支持,请在您的代码中添加此扩展。

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)!]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后简单地调用这个方法

self.showNavigationBar(true, true, titleColor: UIColor.blue, barTintColor: UIColor.red, fontSize: 32.0)
Run Code Online (Sandbox Code Playgroud)

如果还不行的话就用这个

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        search.searchBar.becomeFirstResponder()
    }
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是在情节提要中添加一个高度为 0 的 UIView,并在顶部添加安全区域,在底部添加 UIScrollView/UICollectionView/UITableVIew 或其他可滚动视图,并删除 TopSafeArea 和 ScrollableView Top 之间的直接约束。我知道也许这不是一个解决方案,但我在故事板中做到了。