wake-up-neo.com

iOS 11-Suchleiste springt zum oberen Bildschirmrand

Ich habe eine UITableView, in der ich die Kopfzeile als Suchleiste definiere.

tableView.tableHeaderView = searchController.searchBar

Alles funktioniert nach Plan, bis Sie darauf klicken. Es löst sich scheinbar von der tableView und springt an den oberen Rand des Bildschirms. Die tableView-Zeilen bleiben an Ort und Stelle. Gibt es einen Grund, warum es das in iOS 11 und nicht in iOS 10 tun würde?

13
Tyler Rolfe

Es wird empfohlen, die neue Methode zur Anzeige der Suchleiste/des Suchcontrollers unter iOS 11 anzuwenden. __ Folgendes habe ich getan:

    if #available(iOS 11.0, *) {
        navigationItem.searchController = searchController
    } else {
        tableView.tableHeaderView = searchController.searchBar
    }
12
simonwjw

Mein erster Beitrag zu SO, ich hoffe ich mache das richtig.

Ich hatte genau das gleiche Problem und hatte Probleme, eine Lösung zu finden. Aber jetzt habe ich es geschafft, es zu beheben, indem ich UISearchController subclassing.

Diese Unterklasse hat zwei Eigenschaften:

var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!

Anstatt die searchBar von UISearchController zu verwenden, kann ich jetzt die neue Eigenschaft searchBarWithCustomSize aus meinem benutzerdefinierten searchController verwenden.

tableView.tableHeaderView = customSearchController.searchBarWithCustomSize

Dadurch verhält sich die Suchleiste korrekt, wenn sie aktiv ist. Mit searchBarWithCustomSize haben Sie auch mehr Freiheiten. Sie können beispielsweise den Rahmen bei Bedarf ändern und so weiter.

In meiner Implementierung muss der Delegierte wissen, wann das Textfeld der Suchleiste geändert wurde, aber ich denke, die Verwendung eines Delegierten hängt von Ihrer Situation ab.

3
pontusnt

Versuche dies:

if (@available(iOS 11, *)){
    [searchVC.searchBar addObserver:self forKeyPath:@"frame" options: NSKeyValueObservingOptionNew context:nil];
}else{
    [view addSubview:searchVC.searchBar];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    CGRect rect = [change[@"new"] CGRectValue];
    if (rect.Origin.y == 14) {
        CGRect temp = rect;
        temp.Origin.y = 20;
        [self.searchVC.searchBar setValue:@(temp) forKey:@"frame"];
    }else if (rect.size.height == 56){
        CGRect temp = rect;
        temp.size.height = 50;
        [self.searchVC.searchBar setValue:@(temp) forKey:@"frame"];
    }
}
0
Wong Sam

Versuche dies.

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
}
0
Khalil Ghaus

Ich hatte genau das gleiche Problem - komisches Sprungverhalten der UISearchBar auf iOS11, wobei auf iOS10 alles in Ordnung ist.

In Bezug auf den Rat von Simon Wang oben - das Problem, das ich dort hatte, ist, dass ich meine UISearchBar nicht in einer UIViewController definiere. Ich bin stattdessen in einer anderen UITableViewCell - daher habe ich keinen Zugriff auf die navigationItem und kann meine Suche nicht präsentieren Bar auf diese Weise.

Nach vielen Versuchen und Irrtümern konnte ich nur die UISearchController und die damit verbundenen Delegierten zusammenarbeiten. 

Stattdessen definiere ich eine UISearchBar im Interface Builder und definiere die Layouteinschränkungen entsprechend. Ich mache dann die übergeordnete Klasse mit UISearchBarDelegate konform und mache searchBar.delegate = self

Ich füge dann eine Reihe von Delegatmethoden hinzu, um Inhaltsänderungen an der Suchleiste abzufangen und meine Tabellenergebnisse entsprechend zu aktualisieren:

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {  
   filterContentForSearchText(self.searchBar.text!)
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
   filterContentForSearchText(self.searchBar.text!)
   self.searchBar.resignFirstResponder()
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
   filterContentForSearchText(self.searchBar.text!)
}

Und das Leben ist wieder gut. Hoffe das hilft!

0
Ali Parr