2016-04-05 6 views
3

Ich habe seit einiger Zeit mit der Suchleiste von UISearchController gekämpft. Ich brauche eine Suchfunktion, die in einer Tabellenansicht implementiert werden soll, aber im Gegensatz zu herkömmlichen Methoden habe ich die Suchleiste nicht in eine Tabellenkopfansicht eingefügt. Stattdessen habe ich eine UIView erstellt und die Suchleiste als Unteransicht hinzugefügt. Die UIView, die als Container für die Suchleiste fungiert, hat ihre Einschränkungen ordnungsgemäß im Storyboard mit automatischem Layout festgelegt.UISearchController SearchBar verschiebt sich während der Rotation, während es aktiv ist

Hier sind meine Codes dafür. Beachten Sie, dass ich dies programmgesteuert vorgenommen habe, da UISearchDisplayController und UISearchBar ab iOS 8 zugunsten von UISearchController veraltet sind und noch nicht zu UIKit gekommen sind.

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) 

Allerdings bemerkte ich ein seltsames Verhalten der Suchleiste während der Rotation. Wenn es im Hochformat aktiv ist, drehe ich den Simulator auf Querformat und drücke Abbrechen, die Suchleiste kehrt zu Hochformat zurück.

Effects of activating search in Portrait and then Cancelling in Landscape

Das gleiche passiert in die andere Richtung zu sich um.

Effects of activating search in Landscape and then Cancelling in Portrait

Ich würde irgendwelche Ideen zu schätzen wissen oder vielleicht ein paar Hinweise auf die richtige Richtung, dies zu lösen, wie ich für Tage zumindest an dieser gewesen sein. Vielen Dank

Antwort

4

Also nach so vielen Tagen kämpfen mit diesem:

Portrait zu Landschaft

  1. Fabrikat SearchBar/SearchController aktiv in Portrait
  2. Rotate Landschaft
  3. Press Cancel und SearchBar gehen zurück auf Portrait width

Landschaft

  1. Fabrikat SearchBar/SearchController aktiv in Landschaft
  2. Rotate Portrait Potrait
  3. Drücken Sie Abbrechen und SearchBar gehen zurück zur Landschaft Breite

ich es endlich gelöst mein eigenes. Es scheint, dass, wenn ein Benutzer drückt auf den SearchBar Abbrechen, wird der Viewcontroller viewDidLayoutSubviews nennen so habe ich versucht, durch den Aufruf dieser Funktion in viewDidLayoutSubviews die Breite zurück:

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

Aber das ist nicht so gut funktionieren, wie ich dachte. Also hier ist, was ich denke passiert. Wenn ein Benutzer den SearchController/SearchBar aktiviert, speichert der SearchController den aktuellen Frame, bevor er die Größe selbst ändert. Wenn ein Benutzer dann auf Abbrechen klickt oder ihn ablehnt, wird der gespeicherte Rahmen verwendet und die Größe auf diese Rahmengröße geändert.

Um die Breite neu auszurichten, wenn ich Abbrechen drücke, muss ich das UISearchControllerDelegate in meinem VC implementieren und erkennen, wenn der SearchController entlassen wird, und setupSearchBarSize() erneut aufrufen.

Hier sind die relevanten Codes, diese Frage zu lösen:

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

Wie Sie Breite ändern können. Sie können Frame einstellen! –

+0

Mit diesem für eine Weile gekämpft. Danke für den Beitrag! Zusätzlich können Sie 'searchController.searchBar.sizeToFit()' anstelle von 'self.searchController.searchBar.frame.size.width = self.view.frame.size.width' verwenden, zumindest das hat für mich funktioniert. –

+0

das ist das einzige, was für mich funktionierte nach dem Ausprobieren vieler viele Korrekturen! Vielen Dank!! – user2704776

2

ist hier einfachere Lösung:

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

Das hat bei mir nicht funktioniert – user2704776