30 votes

Changer la taille de UISearchBar TextField?

J'ai une UITableView avec un index sur le côté; Je veux y ajouter un UISearchBar, mais l'index chevauche le "x" pour effacer la recherche. J'ai remarqué que dans l'application Contacts, le champ de texte dans UISearchBar est redimensionné pour s'adapter à cela, mais je ne peux pas trouver comment le faire dans ma propre application.

J'ai essayé ce qui suit dans mon viewDidLoad, mais cela ne semble pas fonctionner.

 UITextField * textField = (UITextField *)[[self.search subviews] objectAtIndex:0];
CGRect r = textField.frame;

[textField setFrame:CGRectMake(r.origin.x, r.origin.y, r.size.height, r.size.width-30)];
 

Des idées?

30voto

Mike Points 256

il est beaucoup plus facile que toutes ces suggestions. Dans interface builder, au lieu de mettre la Barre de Recherche comme en-tête de votre Table, vous pouvez mettre une Vue à la place. Ensuite, placez une Barre de Navigation à l'intérieur de ce point de Vue. Prenez la gauche de la poignée de redimensionnement de la Barre de Navigation et la tirer vers la droite jusqu'à la N B est à seulement 25 pixels de large. Effacer le Titre dans la N B (double-cliquez pour le sélectionner, puis de les supprimer). Ensuite, ajouter une Barre de Recherche dans la même Vue. Déplacer son droit de redimensionnement de la poignée vers la gauche, ajuster de sorte qu'il jouxte le N B. c'est tout.

Vous pouvez activer un bouton annuler si vous le souhaitez et aussi de ne pas chevaucher les index (reste dans la barre de recherche).

Apparemment, une Vue de la Table ne peut avoir 1 sous-vue dans son en-tête, c'est pourquoi vous avez besoin de mettre la Vue en premier, puis le N B et de la Barre de Recherche à l'intérieur d'elle.

Mise à JOUR: voir le Début de Développement pour iPhone à partir de Apress, p. 241 du SDK 3 édition. Vous venez de désactiver l'index lors de la recherche.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    if (isSearching) {
        return nil;
    }
    return keys;
}

Aussi, ils parlent de l'ajout d'une loupe en haut de l'index.

Grand livre de tous les environs.

16voto

Nick Farina Points 1608

Pourquoi ne pas simplement faire la réelle UISearchBar petits horizontalement, et de la place un (vide) UINavigationBar à la droite de celui-ci? Ils vont rendre le fond exactement la même.

Mieux que le piratage de l'intérieur de la Pomme, les objets qui pourraient changer.

Aussi, lors de l'animation de la UISearchBar de la largeur, vous remarquerez que l'intérieur du champ de texte n'est pas animé avec elle. Vous pouvez résoudre ce problème en appelant UISearchBar du "layoutSubviews" au sein de votre bloc d'animation après la modification de son cadre. (c'est là où il détermine la taille de l'intérieur de champ de texte)

8voto

Padraig Points 710

Ok, j'ai trouvé une solution.

  1. Créer une sous-classe de UISearchBar
  2. Incluez ce code dans la méthode drawRect :.

     UITextView * textField = [self.subviews objectAtIndex:0];
    textField.frame = CGRectMake(5, 6, (310 - kRightSideMargin), 31); 
    
    
    [super drawRect:rect];
     

Remarque: kRightSideMargin est une constante que j'ai définie dans mon fichier d'en-tête; Je l'ai mis à 25.

Merci pour les suggestions de tout le monde.

6voto

Ernie Thomason Points 101

Depuis iOS 6, la solution de barre de navigation ne fonctionnait pas bien pour moi en raison de l'apparence légèrement différente entre UISearchBar et UINavigationBar. Donc, je suis passé à quelque chose de similaire à l'approche de Padraig en sous-classant l'UISearchBar.

 @interface SearchBarWithPad : UISearchBar
@end


@implementation SearchBarWithPad
- (void) layoutSubviews {

    [super layoutSubviews];
    NSInteger pad = 50;
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass: [UITextField class]])
        view.frame = CGRectMake (view.frame.origin.x, view.frame.origin.y, view.frame.size.width - pad, view.frame.size.height);
    }   
}
@end
 

Edit: Ah, je ne l'ai pas essayé, mais je pense que vous pourriez définir le clipToBounds = YES d'une barre de navigation pour désactiver sa nouvelle ombre, créant ainsi une apparence cohérente à nouveau entre les deux contrôles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X