web-dev-qa-db-fra.com

barre de recherche iOS 11 sautant en haut de l'écran

J'ai un UITableView dans lequel je règle son en-tête pour être une barre de recherche.

tableView.tableHeaderView = searchController.searchBar

Tout fonctionne comme prévu jusqu'à ce que vous cliquiez dessus. Apparemment, il se détache de la tableView et passe en haut de l'écran. Les lignes de la tableView restent en place. Quelle que soit la raison pour laquelle il ferait cela dans iOS 11 et pas dans iOS 10?

13
Tyler Rolfe

Il est conseillé d’appliquer la nouvelle façon d’afficher la barre de recherche/le contrôleur de recherche sur iOS 11 . Voici ce que j’ai fait:

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

Mon premier post sur SO, j'espère que je le fais bien.

J'ai eu exactement le même problème et j'ai vraiment eu du mal à trouver une solution. Mais maintenant, j'ai réussi à résoudre ce problème en sous-classant UISearchController.

Cette sous-classe a deux propriétés:

var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!

Ainsi, au lieu d'utiliser la barre de recherche de UISearchController, je peux maintenant utiliser la nouvelle propriété searchBarWithCustomSize de mon moteur de recherche personnalisé, comme ceci:

tableView.tableHeaderView = customSearchController.searchBarWithCustomSize

Cela fait que la barre de recherche se comporte correctement lorsqu'elle est active. Vous avez également plus de liberté avec ce searchBarWithCustomSize, par exemple, vous pouvez changer son cadre si nécessaire, etc.

Dans mon implémentation, j'ai besoin que le délégué sache quand le champ de texte de la barre de recherche a été modifié, mais je suppose que l'utilisation d'un délégué dépend de votre situation.

3
pontusnt

Essaye ça:

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

Essaye ça.

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

J'ai eu exactement le même problème: le comportement étrange de sauter de UISearchBar sur iOS11, où sur iOS10 tout va bien.

En ce qui concerne le conseil de Simon Wang ci-dessus - le problème que j'ai là-bas est que je ne définis pas ma UISearchBar dans une UIViewController, je suis plutôt dans une autre UITableViewCell - donc je n'ai pas accès à la navigationItem et ne peux pas présenter ma recherche bar de cette façon.

Quoi qu’il en soit, après beaucoup d’essais et d’erreur, la seule façon de faire fonctionner les choses était de supprimer complètement la UISearchController et les délégués concernés. 

Au lieu de cela, je définis une variable UISearchBar dans Interface Builder et je définis ses contraintes de présentation, le cas échéant. Je rends ensuite sa classe parente conforme à UISearchBarDelegate et fais searchBar.delegate = self

J'ajoute ensuite un ensemble de méthodes de délégation pour intercepter les modifications de contenu dans la barre de recherche et met à jour les résultats de ma table en conséquence:

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!)
}

Et la vie est belle à nouveau. J'espère que cela t'aides!

0
Ali Parr