swift - 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 的高度?在此处输入图像描述
解决方案
原来我只需要改变添加子视图的顺序,如下图所示:
override func viewDidLoad() {
super.viewDidLoad()
setupSearchBar()
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]
view.addSubview(searchBar)
view.addSubview(navigationBar)
}
推荐阅读
- html - nth-child 选择错误的孩子
- android - 如何从 LinkedIn API 获取“大学名称”?
- python - 如何在熊猫中将数据框转换为多级数据框
- database - 如何在 React 项目中连接 LowDB?
- python - Python中的正则表达式不匹配
- primefaces - 从bean使用PdfWriter时如何管理错误“无法调用getWriter(),getOutputStream()已经调用”
- java - 如何在 intellij 中设置默认 IGNITE_HOME 环境变量
- typescript - Vue 组件不会被动更新
- server - 创建重定向到 Mailto 的 Shopify 页面
- java - 是否可以在 IText 中更改已解析 HTML 的字体?