Bonjour, je recommence à développer sur iphone après quelques mois d’arrêt, j’en profite aussi pour tester l’Ipad (sur simulateur :p).
Cette semaine j’ai cherché à faire fonctionner une UISearchBar avec le controller qui va bien et j’ai eu quelque souci. Si techniquement c’est assez simple à mettre en place, graphiquement j’ai eu quelque souci.
Mon architecture :
Mon application a une UITabBar, puis sur une des sous vue j’ai une liste de résultat avec la SearchBar. Cet écran n’est pas directement une UITableView, c’est un navigation controller qui contient une UITableView.

Ma UITableView est crée directement en code et est à hauteur fixe, et mes cellules ont une hauteur de 60:
1 2 3 4 5 6 7 8 9 | - (void)viewDidLoad { CGRect frame = CGRectMake(0, 75, 320, 262); // Initialise une table view. myTableView = [[UITableView alloc] initWithFrame:frame]; myTableView.rowHeight = 60; // Ajout la tableView à l'écran et autres par la suite } |
Mes soucis
Les soucis viennent quand j’utilise la barre de recherche:
- Les cellules sont bien réutilisées mais la hauteur est celle par défaut du coup tout mes items sont mal placés. Joli bug graphique.
- Mes résultats sont bien filtrés, mais il est impossible de scroller. La liste revient toujours en haut. Comme si ma liste avait une hauteur tellement grande que le scroll était inefficace.
Solutions
Bon, j’en suis pas vraiment fier, ça tient plus de hooks qu’autres choses mais ça a le mérite de marcher et ça n’a pas l’air trop lourd en terme de performance sur mon 3GS.
En fait c’est simple, à chaque fois il faut refixer les hauteurs au moment oppertun.
- Pour les cellules, c’est à leur initialisation :
1 2 3 4
- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { return 60; }
-
Pour la liste, c’est quand on lance une recherche :
1 2 3 4 5 6 7
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { CGRect frame = CGRectMake(0, 75, 320, 262); [[[self searchDisplayController] searchResultsTableView] setFrame:frame]; // faire sa recherche ensuite }
Donc en terme de performance y doit y avoir moyen de fixer ses tailles une fois pour toute mais je n’ai pas trouvé comment. Si quelqu’un a la solution je suis preneur.






