首页 > 解决方案 > UISearchBar 与 UINavigationBar 重叠?

问题描述

我以编程方式将 UISearchBar 添加到下面的 viewController 中,如下面的代码所示:

import UIKit

class BlueBookUniversalBeamsVC: UIViewController, UINavigationBarDelegate {

    lazy var navigationBar = CustomUINavigationBar(rightNavBarTitle: "Sort Data", rightNavBarTitleHexColourCodeNormalState: "#333301", rightNavBarTitleHexColourCodeHighlightedState: "#FFFF05", rightNavBarButtonTarget: self, rightNavBarSelector: #selector(navigationBarRightButtonPressed(sender:)), isNavBarTranslucent: false, navBarBackgroundColourHexCode: "#CCCC04", navBarBackgroundColourAlphaValue: 1.0, navBarStyle: .black, preferLargeTitles: false, navBarDelegate: self, navBarItemsHexColourCode: "#E0E048", normalStateNavBarLeftButtonImage: "normalStateBackButton", highlightedStateNavBarLeftButtonImage: "highlightedStateBackButton", navBarLeftButtonTarget: self, navBarLeftButtonSelector: #selector(navigationBarLeftButtonPressed(sender:)), labelTitleText: "Universal Beams (UB)", titleLabelFontHexColourCode: "#FFFF52", labelTitleFontSize: 16, labelTitleFontType: "AppleSDGothicNeo-Light")

    var searchBar = UISearchBar()

    var isSearching = false

    override func viewDidLoad() {

        super.viewDidLoad()

        setupSearchBar()

        UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]

        view.addSubview(navigationBar)

        view.addSubview(searchBar)

    }

    override func viewWillLayoutSubviews() {

        NSLayoutConstraint.activate([

            navigationBar.leftAnchor.constraint(equalTo: view.leftAnchor),

            navigationBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),

            navigationBar.rightAnchor.constraint(equalTo: view.rightAnchor)

            ])

    }

    override func viewDidLayoutSubviews() {

        setupConstraints()

    }

    @objc func navigationBarLeftButtonPressed(sender : UIButton) {

    }

    @objc func navigationBarRightButtonPressed(sender : UIButton) {

    }

    func position(for bar: UIBarPositioning) -> UIBarPosition {

        return UIBarPosition.topAttached

    }

    func setupSearchBar() {

        searchBar.delegate = self

        searchBar.translatesAutoresizingMaskIntoConstraints = false

    }

    func setupConstraints() {

        NSLayoutConstraint.activate([

            searchBar.leftAnchor.constraint(equalTo: view.leftAnchor),

            searchBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: navigationBar.frame.size.height),

            searchBar.rightAnchor.constraint(equalTo: view.rightAnchor),

            ])

    }

}

extension BlueBookUniversalBeamsVC: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

        if searchText.isEmpty == false {

            filteredArrayOutOfUniversalBeamsArrayDataExtractedFromTheCsvFileUsingTheParserAsPerSearchedCharacters = universalBeamsArrayDataExtractedFromTheCsvFileUsingTheParser.filter({ $0.fullSectionDesignation.lowercased().prefix(searchText.count) == searchText.lowercased() })

            isSearching = true

        } else {

            isSearching = false

        }

    }

}

但是,当我如附图所示运行和测试应用程序时,可以看到 UISearchBar 与 UINavigationBar 重叠。我仍然可以点击 UINavigationBar 左右按钮,但是,由于某种原因,UISearchBar 在特定距离上与 UINavigationBar 重叠。知道为什么我会出现这种行为吗?理想情况下,我希望我的 UISearchBar 直接出现在 UINavigationBar 下方,并且它的高度等于其中 textField 的高度?在此处输入图像描述

标签: swiftxcodeconstraintsuisearchbar

解决方案


原来我只需要改变添加子视图的顺序,如下图所示:

override func viewDidLoad() {

        super.viewDidLoad()

        setupSearchBar()

        UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]

        view.addSubview(searchBar)

        view.addSubview(navigationBar)

    }

推荐阅读