web-dev-qa-db-fra.com

iOS7 lorsque UIsearchbar ajouté à UINavigationBar n'affiche pas le bouton d'annulation

J'ajoute UISearchBar au-dessus de UINavigationBar et définit UIsearchbar showsCancelButton YES, fonctionne correctement sous iOS6, mais sous iOS7 sans afficher le bouton d'annulation . J'ai utilisé l'extrait de code ci-dessous 

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 600, 44)];
searchBar.showsCancelButton = YES;
searchBar.translucent = NO;
[searchBar setTintColor:[UIColor redColor]];
searchBar.backgroundColor = [UIColor yellowColor];
[self.navigationController.navigationBar   addSubview:searchBar];
22
JackYi

Pour une raison quelconque, iOS7 n'affiche pas le bouton d'annulation lorsqu'il est ajouté à une barre de navigation. Cela se produit également si vous essayez de le définir comme titleView d'un article de navigation.

Vous pouvez contourner ce problème en encapsulant UISearchBar dans un autre UIView en premier. Voici comment je le fais en tant que titleView:

UISearchBar *searchBar = [UISearchBar new];
searchBar.showsCancelButton = YES;
[searchBar sizeToFit];
UIView *barWrapper = [[UIView alloc]initWithFrame:searchBar.bounds];
[barWrapper addSubview:searchBar];
self.navigationItem.titleView = barWrapper;
44
Rodskjegg

J'ai eu le même problème, sur la barre de recherche de l'iPhone avec le bouton d'annulation, mais le bouton d'annulation n'a pas été affiché sur l'iPad. Enveloppant UIsearchBar à UIView comme un problème de style @Rodskjegg. Sur iPad, UIsearchBar le définit comme titleView d'un élément de navigation et ajoute UIBarButtonItem à setRighttBarButtonItem comme étant UIBarButtonSystemItemCancel.

    [self.navigationItem setLeftBarButtonItem:Nil animated:YES];
    self.navigationItem.titleView = self.searchBar;

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    {
        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(searchBarCancelButtonClicked:)];

        [self.navigationItem setRightBarButtonItem: cancelButton animated:YES];
    }
    else {
        [self.navigationItem setRightBarButtonItem: nil animated:YES];
    }
6
vcalfa

Depuis iOS 7, vous pouvez simplement définir la propriété displaysSearchBarInNavigationBar sur YES sur la UISearchDisplayController pour obtenir automatiquement une UISearchbar dans la NavigationBar.

4
kohaxun

OuiDans iOS 7, le bouton est situé sur l'écran, mais son titre peut être invisibleMa solution a été de définir le style de recherche sur "Minimal" et de choisir la couleur de la barre de couleur pour "Annuler" dans IB.

enter image description here

Et le résultat dans un simulateur:

enter image description here

4
David

J'ai eu le même problème. Sur l'iPhone, l'annulation de la recherche a bien été affichée, mais pas sur l'iPad.

La solution de contournement consistant à insérer la barre UISearchBar dans une autre UIView ne fonctionnait pas bien pour moi car elle avait une apparence différente et une largeur incorrecte en rotation.

Ma solution est simple: utiliser la recherche SANS annuler et ajouter annuler sous le nom UIBarButtonItem. 

1
Tal Haham

Implémentez le délégué de la barre de recherche et utilisez ceci:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = YES;
}
0
user3607589