2016-04-05 2 views
3

Я долгое время искал поисковую панель UISearchController. Мне нужна функция поиска, которая будет реализована в виде таблицы, но в отличие от обычных методов я не помещал строку поиска в виде заголовка таблицы. Вместо этого я создал UIView и добавил панель поиска в качестве подпрограммы к ней. UIView, который действует как контейнер для панели поиска, имеет свои ограничения, правильно установленные на раскадровке с автоматической компоновкой.UISearchController SearchBar смещается во время вращения

Вот мои коды. Обратите внимание, что я сделал это программно, потому что UISearchDisplayController и UISearchBar устарели с iOS 8 в пользу UISearchController и еще не пришли в UIKit.

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) 

Однако, я заметил одно странное поведение панели поиска во время вращения. Когда он активен в режиме «Портрет», я поворачиваю симулятор на «Пейзаж» и нажимаю «Отмена», панель поиска возвращается к «Портретная ширина».

Effects of activating search in Portrait and then Cancelling in Landscape

То же самое происходит с точностью до наоборот тоже.

Effects of activating search in Landscape and then Cancelling in Portrait

Я был бы признателен за любые идеи или, может быть, некоторые намеки в сторону правильного направления, чтобы решить эту проблему, как я был на этом в течение нескольких дней по крайней мере. Большое спасибо

ответ

4

Таким образом, после стольких дней борется с этим:

Портрет в пейзаже

  1. Сделать SearchBar/SearchController активен в портретном
  2. Поворот на альбомную
  3. Пресс Отмена и поискБар вернутся к ширине портрета

Пейзаж с Портретная

  1. Сделать SearchBar/SearchController активен в ландшафтном
  2. Поворот Портрет
  3. Нажмите кнопку Отмена и SearchBar вернется в пейзаж ширина

я, наконец, решил его мой собственный. Кажется, что, когда пользователь нажимает Отмена на SearchBar, то ViewController будет вызывать viewDidLayoutSubviews, таким образом, я попытался сбросить ширину, вызвав эту функцию в viewDidLayoutSubviews:

func setupSearchBarSize(){ 
    self.searchController.searchBar.frame.size.width = self.view.frame.size.width 
} 

Но это не сработало так, как я думал. Итак, вот что я думаю. Когда пользователь активирует SearchController/SearchBar, SearchController сохраняет текущий кадр, прежде чем он изменит размер. Затем, когда пользователь нажимает Отменить или отклоняет его, он будет использовать сохраненный фрейм и изменять размер до этого размера кадра.

Поэтому, чтобы заставить его ширину изменить, когда я нажимаю Отмена, я должен реализовать UISearchControllerDelegate в своем VC и обнаружить, когда 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() 
} 
} 
+0

Как вы можете изменить ширину. Вы можете установить Frame! –

+0

Борясь с этим некоторое время. Спасибо вам за публикацию! Кроме того, вы можете просто выполнить 'searchController.searchBar.sizeToFit()' вместо 'self.searchController.searchBar.frame.size.width = self.view.frame.size.width', по крайней мере, это сработало для меня. –

+0

это единственное, что сработало для меня после многих попыток! Спасибо!! – user2704776

2

Вот простое решение:

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) 
    } 
+0

Это не сработало для меня – user2704776

Смежные вопросы