Die Struktur:
View1 (Klick auf eine Schaltfläche) -> modal präsentieren (MyModalView: UITableViewController)
MyModalView verfügt über einen eingebetteten UISearchController. Die Suchleiste von UISearchController befindet sich in MyModalView.tableView.tableHeaderView.
Seit iOS 8.0 funktioniert das einwandfrei. Unter iOS 9 verschwindet die Suchleiste jedoch, wenn der UISearchController aktiv ist. Bitte schauen Sie sich diese Bilder unten an
UISearchController aktiv auf iOS 8:
UISearchController aktiv auf iOS 9:
Der Standardcode:
override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
Dieses Problem tritt auch in der Beta von iOS 9.1 auf.
Jede Idee/jeder Hinweis wird sehr geschätzt
Prost.
Es scheint, dass wir alle das gleiche Problem hatten, aber sie wurden auf unterschiedliche Weise gelöst. Allerdings hat keine der vorgeschlagenen Antworten für mich funktioniert :(. Trotzdem vielen Dank für Ihre Zeit.
Ich habe eine Lösung gefunden, die mein Problem gelöst hat. Die Option Kanten verlängern - Unter undurchsichtigen Balken (MyModalView: UITableViewController) wird im Storyboard mit Interface Builder auf true gesetzt.
In Summe:
MyModalView: UITableViewController, das im Storyboard den Interface Builder hat
Kanten verlängern: - Unter den oberen Leisten wurde ein Häkchen gesetzt - Unter den unteren Leisten wurde angekreuzt
Ich bin mir nicht sicher, was genau das Problem ist, aber ich habe es durch Folgendes behoben:
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
Meine Vermutung ist, dass UISearchController
etwas unkonventionelles tut, wenn es versucht, sich als Navigationsleiste zu präsentieren. Dies ist also ein Hack, der den Benutzer jedoch zumindest nicht blockiert. Die Suchleiste macht keine coolen Animationen und verdeckt die Navigationsleiste.
Ich habe festgestellt, dass die simulierten Metriken (obere Leiste) im Storyboard dieses Problem verursachen ... In meinem Fall funktionieren die folgenden Zeilen, aber ich weiß immer noch nicht, warum.
- (void)willPresentSearchController:(UISearchController *)searchController {
// do something before the search controller is presented
self.navigationController.navigationBar.translucent = YES;
}
-(void)willDismissSearchController:(UISearchController *)searchController
{
self.navigationController.navigationBar.translucent = NO;
}
Ich musste
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
Ich habe eine ähnliche Frage hier gefunden - aber in meinem Fall war dies nicht die viewDidLoad-Methode. Ich musste verschiedene Ansichten ausprobieren, bis es funktionierte. Jetzt kann ich sowohl eine benutzerdefinierte Navigationsleistenfarbe als auch die Suchleiste haben.
Danke @wiles duan und @Techprimate
In meinem Fall habe ich dieses Problem behoben, indem ich Folgendes eingestellt habe:
self.definesPresentationContext = NO;
Implementieren Sie die folgenden zwei Methoden in UISearchControllerDelegate
- (void)willPresentSearchController:(UISearchController *)searchController {
// do something before the search controller is presented
self.navigationController.navigationBar.translucent = YES;
}
-(void)willDismissSearchController:(UISearchController *)searchController
{
self.navigationController.navigationBar.translucent = NO;
}
Ich habe es in meinem Fall behoben, indem ich es entfernte
definesPresentationContext = true
Ich habe noch nicht getestet, ob es Nachteile gibt, wenn Sie das entfernen!
Ich hatte das gleiche Problem und als ich die Benutzeroberfläche von Xcode debuggte, stellte ich fest, dass die UISearchBar
-Ansicht in eine andere Ansicht verschoben und die Breite auf Null gesetzt wurde.
Ich habe es behoben, indem ich die definesPresentationContext
-Eigenschaft der UISearchController
auf false
und die true
für die enthaltende UITableViewController
gesetzt habe.
Ich habe nur eine Zeile zu Ihrer viewDidLoad()
hinzugefügt.
override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.definesPresentationContext = false // Disable the presentation controller
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true // This one remains the same
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
Ich habe keine Navigationsleiste an dieser Stelle einer App. Keiner der anderen SO Beiträge hat mir geholfen, also habe ich es so korrigiert:
- (void)layoutSubviews
{
[[[self searchController] searchBar] sizeToFit];
}
Wenn Sie die Navigationsleiste im Storyboard dauerhaft auf durchscheinend setzen, wurde mein Problem gelöst.
Es klappt
override func viewDidLoad() {
super.viewDidLoad()
self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
sc.hidesNavigationBarDuringPresentation = false
macht den Trick für mich
lazy var searchController:UISearchController = {
let sc = UISearchController(searchResultsController: nil)
sc.searchResultsUpdater = self
sc.obscuresBackgroundDuringPresentation = false
sc.searchBar.placeholder = "Search"
sc.hidesNavigationBarDuringPresentation = false
return sc
}()
Wenn Sie Ihre Navigationsleiste ausblenden möchten und den Suchcontroller im Vollbildmodus anzeigen möchten, legen Sie Folgendes in Ihrer Navigationsleiste fest. Die Suchleiste wird nicht aufgehoben:
navigationController?.navigationBar.translucent = true
Keiner von ihnen hat für mich gearbeitet, ich habe es mit diesem Hack behoben
func position(for bar: UIBarPositioning) -> UIBarPosition {
if UIDevice.current.userInterfaceIdiom == .pad {
return .top
} else {
if iOSVersion <= 9 {
return .top
}
return .topAttached
}
}