UISearchBar overlaps with UINavigationBar?



我以编程方式将UISearchBar添加到下面的视图控制器中,如下面的代码所示:

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下方,并且其高度相当于其中文本字段的高度?在此处输入图像描述

事实证明,我只需要更改添加的子视图的顺序,如下所示:

override func viewDidLoad() {
super.viewDidLoad()
setupSearchBar()
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]
view.addSubview(searchBar)
view.addSubview(navigationBar)
}

最新更新