我一直在与UISearchController的搜索栏挣扎了很长一段时间。我需要在tableview上实现搜索功能,但与传统方法不同,我没有将搜索栏放在表头视图上。相反,我创建了一个UIView
并将搜索栏添加为子视图。充当搜索栏容器的searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.autoresizingMask = .FlexibleRightMargin
searchController.searchBar.delegate = self
definesPresentationContext = true
self.searchContainerView.addSubview(searchController.searchBar)
在故事板上使用自动布局正确设置了约束。
以下是我的代码。请注意,我是以编程方式执行此操作的,因为UISearchDisplayController和UISearchBar从iOS 8开始已被弃用,而不是UISearchController,而且尚未来到UIKit。
base.py
但是,我确实注意到旋转期间搜索栏的一个奇怪的行为。当它在纵向上处于活动状态时,我将模拟器旋转到横向,然后按取消,搜索栏返回到纵向宽度。
反过来也是如此。
我很感激任何想法或者一些暗示正确的方向来解决这个问题,因为我至少已经在这几天了。非常感谢你
答案 0 :(得分:4)
经过这么多天的努力之后:
纵向人像
景观到Potrait
我终于自己解决了。似乎当用户按下SearchBar上的Cancel时,ViewController将调用viewDidLayoutSubviews
,因此我尝试通过在viewDidLayoutSubviews
中调用此函数来重置宽度:
func setupSearchBarSize(){
self.searchController.searchBar.frame.size.width = self.view.frame.size.width
}
但这并不像我想象的那样好。所以这就是我认为发生的事情。当用户激活SearchController / SearchBar时,SearchController会在调整自身大小之前保存当前帧。然后当用户按下取消或取消它时,它将使用保存的帧并调整大小为该帧大小。
因此,当我按下Cancel时强制其宽度重新排列,我必须在我的VC中实现UISearchControllerDelegate并检测何时解除SearchController,并再次调用setupSearchBarSize()
。
以下是解决此问题的相关代码:
class HomeMainViewController : UIViewController, UISearchControllerDelegate, UISearchResultsUpdating, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
@IBOutlet weak var searchContainerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.autoresizingMask = .FlexibleRightMargin
searchController.searchBar.delegate = self
searchController.delegate = self
definesPresentationContext = true
self.searchContainerView.addSubview(searchController.searchBar)
setupSearchBarSize()
}
func setupSearchBarSize(){
self.searchController.searchBar.frame.size.width = self.view.frame.size.width
}
func didDismissSearchController(searchController: UISearchController) {
setupSearchBarSize()
}
override func viewDidLayoutSubviews() {
setupSearchBarSize()
}
}
答案 1 :(得分:4)
这是更简单的解决方案:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { (context) in
self.searchController.searchBar.frame.size.width = self.view.frame.size.width
}, completion: nil)
}