UISearchController SearchBar在旋转期间处于活动状态时未对齐

时间:2016-04-05 15:02:52

标签: swift orientation uisearchbar uisearchcontroller

我一直在与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

但是,我确实注意到旋转期间搜索栏的一个奇怪的行为。当它在纵向上处于活动状态时,我将模拟器旋转到横向,然后按取消,搜索栏返回到纵向宽度。

Effects of activating search in Portrait and then Cancelling in Landscape

反过来也是如此。

Effects of activating search in Landscape and then Cancelling in Portrait

我很感激任何想法或者一些暗示正确的方向来解决这个问题,因为我至少已经在这几天了。非常感谢你

2 个答案:

答案 0 :(得分:4)

经过这么多天的努力之后:

纵向人像

  1. 使用Portrait
  2. 激活SearchBar / SearchController
  3. 旋转至风景
  4. 按取消,SearchBar将返回纵向宽度
  5. 景观到Potrait

    1. 使景观中的SearchBar / SearchController处于活动状态
    2. 旋转至人像
    3. 按取消,SearchBar将返回横向宽度
    4. 我终于自己解决了。似乎当用户按下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)
    }