Ich habe eine UISearchController
mit einer UITableViewController
als searchResultsController
. Die UISearchBar
dieser searchController
ist so eingestellt, dass sie in der tableHeaderView
meines aktuellen tableView
in meinem Root ViewController angezeigt wird. Fast alles funktioniert wie erwartet. Aber in der Animation von UISearchBar
(Wenn ich auf die Suchleiste klicke und die UINavigationBar
-Ansicht verbirgt und die Suchleiste nach oben geht, wie in der UISearchDisplayController
), habe ich ein seltsames Verhalten. Anstatt sich an die Position von UINavigationBar
(y: 0) zu bewegen, springt es aus dem Bildschirm und startet die Animation, die die Schaltfläche "Abbrechen" zeigt. Ich habe versucht, meinen Instanziierungscode anstelle von viewDidLoad
in init
zu verschieben, und die Dinge sind genau die gleichen. Ich denke, dass der Schwerpunkt des Problems im Rahmen der searchResultsController
-Ansicht liegt, aber ich bin mir nicht sicher (ich habe versucht, den Rahmen ohne Erfolg festzulegen). Alles, was ich tue, ist in reinem Code.
Hier ist der relevante Teil des Codes:
- (void) viewDidLoad {
[super viewDidLoad];
// search controller setup
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
self.searchController.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.definesPresentationContext = YES;
}
Und ich habe eine faul Last für die searchResultsController
:
- (UITableViewController *)searchResultsController {
if (_searchResultsController == nil) {
_searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
_searchResultsController.tableView.delegate = self;
_searchResultsController.tableView.dataSource = self;
}
return _searchResultsController;
}
Ich habe den Beispielcode von Apple heruntergeladen, aber er verwendet StoryBoards und ein Xib für UITableViewCell. Der SearchController funktioniert perfekt im Projekt. Hat jemand das gleiche Problem? Wie kann ich das beheben? Alle Lösungen oder Vorschläge wären dankbar.
Danke für ihre Aufmerksamkeit.
Hinzufügen
self.extendedLayoutIncludesOpaqueBars = YES;
auf viewDidLoad
Methode
Haben Sie versucht, die hidesNavigationBarDuringPresentation auf false zu setzen? Kopfschmerzen behoben.
self.searchController.hidesNavigationBarDuringPresentation = false;
Das Einfügen der Suchleiste in die Navigationsleiste bietet meiner Meinung nach eine solidere Benutzererfahrung (für das iPhone).
self.navigationItem.titleView = self.searchController.searchBar;
Um dies klarer zu machen, hat die Antwort von Lorenzo für mich funktioniert.
self.definesPresentationContext = YES;
Probieren Sie es aus:
Zuerst müssen Sie das delegieren
UISearchControllerDelegate
Für Swift
func willPresentSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = false
}
Versuchen Sie in Swift:
override func viewDidLoad() {
edgesForExtendedLayout = []
searchController.hidesNavigationBarDuringPresentation = false
// ...
}
Swift 3,01
func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
In meinem Fall befand sich die Suchleiste in der tableHeaderView und es war keine Navigationsleiste auf dem Bildschirm. Die SearchBar animiert jedoch nach oben und überlappt die Statusleiste, wenn sie aktiv wird. Die Lösung, um dies zu verhindern, war:
searchController.hidesNavigationBarDuringPresentation = false
Was seltsam ist, weil der View-Controller, wie gesagt, keine Navigationsleiste verwendet hat.
Mir ist aufgefallen, dass der UISearchController in einer meiner Ansichten perfekt funktioniert, nicht aber in der anderen. Das Problem lag beim UITableViewController und nicht beim UIViewController. Wenn Sie zu einem UIViewController mit einem UITableView wechseln und ordnungsgemäß eingeschränkt sind, treten keine Probleme auf. Ich habe meine mit einer XIB implementiert und es hat perfekt funktioniert.