【问题标题】:Show search bar in navigation bar and large title also without scrolling on iOS 13在导航栏中显示搜索栏和大标题也无需在 iOS 13 上滚动
【发布时间】:2020-03-02 18:13:37
【问题描述】:

我在 iOS 13 上将 UISearchController 附加到 navigationItem.searchController。这很好用:我可以使用漂亮的 iOS 13 风格的搜索栏。

不过,我希望默认看到大标题和搜索栏。

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

有谁知道这怎么可能?

Check this out

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

实际上是这样的

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

【问题讨论】:

  • 您找到解决方案了吗?

标签: ios13 uisearchcontroller large-title preferslargetitles


【解决方案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
    }

对于大型导航栏使用这个

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

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()
    }

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

【讨论】:

  • 非常感谢您的努力,但不幸的是,这不起作用。请记住:我希望默认显示大标题和搜索栏!目前搜索栏代替了大标题。
  • 试试这个扩展大导航栏,这也将修复 iOS 13 中的状态栏颜色
  • 同样的结果。我已经正确设置了该扩展程序,并且一切就绪,只是搜索栏位于大标题上方。
  • 你能分享一下截图吗,如果可以的话试试粗体的内容描述
  • 截图已在帖子中更新!感谢您的帮助!
【解决方案2】:

对我来说,在 viewDidLoad() 方法中添加以下行后它就起作用了:

searchController.hidesNavigationBarDuringPresentation = true
navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()

【讨论】:

  • 如果你设置了navigation.navigationBar.sizeToFit(),searchcontroller 被隐藏并且只显示标题。
【解决方案3】:

我整天都在努力为我的应用实现同样的目标,我终于做到了。

我想在 UITableViewController 上添加一个 searchBar,我就是这样做的。

let searchController: UISearchController = {
    let searchController = UISearchController(searchResultsController: nil)
    
    searchController.searchBar.placeholder = "New Search"
    searchController.searchBar.searchBarStyle = .minimal
    searchController.dimsBackgroundDuringPresentation = false
    searchController.definesPresentationContext = true
    
   return searchController
}()

您首先使用闭包创建一个新的 UISearchController,这样您就可以在您的代码中全局使用它,并在将来更轻松地对其进行自定义。

之后在 viewDidLoad 中,设置 searchSontroller.searchResultsUpdater = selfnavigationItem.searchController = searchController

对我来说,经过大量试验和错误后,它可以完美运行,因为我以编程方式完成所有操作。

【讨论】:

    【解决方案4】:

    这段代码应该可以工作

    class NavigationController: UITabBarController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            createCustomTabBar()
        }
    
        func createCustomTabBar() {
        
            let firstVC = UINavigationController(rootViewController: HomeVC())
            firstVC.title = "Home"
            firstVC.tabBarItem.image = UIImage(systemName: "house.fill")
    
            viewControllers = [firstVC]
        }
    
    class HomeVC: UIViewController {
        let searchController = UISearchController(searchResultsController: nil)
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            view.backgroundColor = .white
            
            navigationController?.navigationBar.prefersLargeTitles = true
            navigationItem.title = "Home"
            navigationItem.searchController = searchController
        }
    }
    

    【讨论】:

    • 点评来源: Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释此代码的作用以及它如何回答问题,以便它对 OP 以及其他也有类似问题的用户有用。请参阅:How do I write a good answer?。谢谢
    猜你喜欢
    • 2018-02-24
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多