Question

Je n'arrive pas à faire en sorte qu'un UISearchBar se positionne de l'extrême gauche à l'extrême droite dans la barre de navigation. Dans la méthode viewDidLoad - (void), j'ai le code suivant:

UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];

Lorsque vous construisez et exécutez, cela semble bien au premier abord. Cependant, en regardant de plus près, vous pouvez voir qu’il ya une marge / un espace à gauche. Cela ne serait pas un gros problème dans le grand schéma des choses, mais lorsque je touche la barre de recherche pour lancer une recherche, j'anime le bouton Annuler. Comme la barre de recherche est légèrement positionnée à droite, l'animation est saccadée et le bouton d'annulation se termine comme suit: texte du lien

On dirait que UINavigationItem est comme une table à trois cellules, où il y a un remplissage sur la première et la dernière que je ne peux pas supprimer - pas plus qu'il ne semble y avoir de moyen de "fusionner" le tout ensemble et puis placez la barre de recherche là-bas. Je sais que cette apparence est possible, car la recherche sur l'AppStore comporte une barre de recherche dans la barre de navigation qui va jusqu'aux bords. Quelqu'un sait comment faire en sorte que la barre de recherche atteigne les bords afin que l'animation de mon bouton d'annulation par insertion se fasse correctement?

Était-ce utile?

La solution 3

Je pense avoir trouvé la réponse - bien que je n’aie pas testé pour vérifier. Dans le numéro que j'ai fourni ci-dessus, j'ai la structure suivante:

contrôleur de barre d’onglet - > contrôleur de navigation - > contrôleur de vue

La barre de recherche en question se trouvait dans un contrôleur de vue, lui-même situé dans le contrôleur de navigation, lequel contrôleur de navigation se trouvant dans la barre d'onglets.

Je regardais avec désinvolture les cours de Stanford CS 193P (printemps 2009) et à la fin de la leçon 13, la réponse aurait peut-être été présentée. Alan Cannistraro a déclaré que la structure de l'application Présence devrait avoir cette structure:

cette structure http://img143.imageshack.us/img143/6/viewcontrollerstructure .jpg

où le contrôleur de la vue de dessous (adjacent au contrôleur de la barre de tabulation) était le contrôleur de la vue doté du contrôle de la barre de recherche. Il a averti que si cela ne se faisait pas de cette façon, vous "auriez des problèmes". Peut-être le problème que j'ai rencontré? Je crois que oui.

Autres conseils

En fait, il existe une solution très simple. Tout ce que vous avez à faire est de créer une vue de largeur zéro pour l'élément précédent:

UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];      
self.navigationItem.backBarButtonItem = hackItem;
[hackView release];
[hackItem release];

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
[searchBar release];

Assurez-vous de le faire dans votre méthode loadView, pas init. Je ne sais pas pourquoi cela fait une différence, mais c'est le cas.

Apparemment, c'est une question de timing. L'avoir dans loadView a cessé de fonctionner pour moi, mais l'afficher dans viewWillAppear fonctionne (avec une vérification afin que cela ne soit fait qu'une fois, bien sûr). Je pense que l’idée est de définir le titleView après une certaine initialisation.

Le code suivant masque la barre de navigation uniquement pour ce contrôleur UIViewController:

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

Pour que la barre UISearchBar apparaisse à l'emplacement de la barre UINavigation, placez dans votre contrôleur de vue racine la barre de recherche où la barre de navigation se trouverait normalement!

Peut-être qu'Apple utilise un UISearchDisplayController pour faire ce genre de choses.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top