ios - iOS 13 / Swift 5:SearchController SearchBar 在编辑结束时展开
问题描述
我在 UITableView 的 ContainerView 中遇到了 UISearchBar(XCode 11、iOS 13、Swift 5)的问题。在那里我创建了一个 UIView (searchView) 和一个 sortView 并排放置,以便用户可以搜索和排序结果。
到目前为止没问题,但是当我通过点击搜索栏的取消按钮结束搜索时,搜索栏会扩展到全屏宽度并与 sortView 重叠。
如何将搜索栏保持在其超级视图(searchView)中?
我已经设置了一些限制来做到这一点,但没有成功。
也可以查看一些代码:
func viewDidLoad() {
...
searchController.searchBar.placeholder = "SR durchsuchen ..."
searchController.searchBar.tintColor = UIColor.white
searchController.dimsBackgroundDuringPresentation = false
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Ende"
searchController.hidesNavigationBarDuringPresentation = false
searchController.searchBar.delegate = self
searchView.addSubview(searchController.searchBar)
...
}
override func viewDidLayoutSubviews() {
self.searchController.searchBar.sizeToFit()
}
override func viewWillDisappear(_ animated: Bool) {
self.searchController.definesPresentationContext = false
self.searchController.isActive = false
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let searchTextField = self.searchController.searchBar.searchTextField
searchTextField.textColor = UIColor(named: "searchFieldTextColor")
searchTextField.leftView?.tintColor = UIColor(named: "searchFieldTextColor")
searchController.searchBar.frame.size.width = searchView.frame.size.width
searchController.searchBar.frame.size.height = searchView.frame.size.height
}
override func viewWillLayoutSubviews() {
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: searchView.frame.width, height: searchView.frame.height)
searchController.searchBar.sizeToFit()
let margins = searchView.layoutMarginsGuide
searchController.searchBar.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: 0).isActive = true
searchController.searchBar.topAnchor.constraint(equalTo: margins.topAnchor, constant: 0).isActive = true
searchController.searchBar.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 0).isActive = true
searchController.searchBar.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: 0).isActive = true
}
解决方案
将这些方法称为 UISearchControllerDelegate:
func didPresentSearchController(_ searchController: UISearchController)
{
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: 266, height: searchController.searchBar.frame.size.height)
}
func didDismissSearchController(_ searchController: UISearchController)
{
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: 266, height: searchController.searchBar.frame.size.height)
}
推荐阅读
- ios - 使用带有 mac 催化剂的撤消管理器
- c++ - c ++中的stringstream有助于从字符串中提取逗号分隔的整数,但不能使用向量提取空格分隔的整数,为什么?
- jenkins - 在 Jenkinsfile 中使用 groovy 更新 semver 之后的版本
- powerpoint - 选择部分缩放矩形而不单击(powerpoint)
- css - post-css 找不到来自 node_modules 的路径
- powershell - 使用 Powershell 通过 IE 使用 JavaScript 时的空文档
- php - liip_imagine [在 Sylius 内] 不在 linux 上缓存图像
- python-3.x - 如果初始条件触发终端 = True 的事件,Solve_ivp 积分会卡住
- xpath - 根据部分匹配机器人查找父元素(不是直接父元素),包括父 ID 和子值
- angular - 在 Angular 中安装 FullCalendar