wake-up-neo.com

UISearchController searchBar in tableHeaderView, die aus dem Bildschirm animiert wird

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.

30
Tiago Maia

Hinzufügen

self.extendedLayoutIncludesOpaqueBars = YES;

auf viewDidLoad Methode

23
dexcell

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;
20
Piet Grootnoten

Um dies klarer zu machen, hat die Antwort von Lorenzo für mich funktioniert.

self.definesPresentationContext = YES;
15
Cedrick

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
}
7
Inuyasha

Versuchen Sie in Swift:

override func viewDidLoad() {
    edgesForExtendedLayout = []
    searchController.hidesNavigationBarDuringPresentation = false

    // ...
}
3
XFreire

Swift 3,01

func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}

func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
1
Maksim Kniazev

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.

0
agilityvision

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.

0
Aaron