Comment changer la couleur du côté Alphabet dans un UITableView indexé?

J’ai un tableau avec un index alphabétique et j’utilise l’alphabet latéral pour passer rapidement la liste. Pour ceux qui ne sont pas familiers, cela utilise ceci:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSSsortingng *)title atIndex:(NSInteger)index { 

Mon problème est que mon application vient d’être noircie. Et maintenant, il est difficile de voir les lettres de l’alphabet sur le côté.

Je n’arrive pas à comprendre comment changer la couleur de l’alphabet. Je voudrais qu’il soit «blanc» si possible.

D’après ce que je peux dire, malheureusement, il n’est pas possible de personnaliser la couleur du texte affiché dans l’index, la plus proche étant la possibilité de modifier la couleur d’arrière-plan et la police de l’index.

Il y a du code dans le livre de recettes iPhone Developers d’Erica Sadun qui montre comment accéder à la vue UITableViewIndex (une classe non documentée). Vous pouvez trouver la référence à la page 175 du livre si vous en avez. Ce qui donne access à la couleur de fond et à la police. Vous pouvez voir un document non officiel lié à cette classe ici .

AVERTISSEMENT Ceci est une utilisation non documentée d’une classe non documentée, vous devez donc être prudent lorsque vous l’utilisez.

Voici un extrait de code du livre de recettes avec des modifications mineures:

 - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { for(UIView *view in [tv subviews]) { if([[[view class] description] isEqualToSsortingng:@"UITableViewIndex"]) { [view setBackgroundColor:[UIColor whiteColor]]; [view setFont:[UIFont systemFontOfSize:14]]; } } //rest of cellForRow handling... } 

Cela illustre comment vous pouvez accéder à la vue UITableViewIndex et la modifier dans certains aspects. Il semble que la vue ne comporte aucune sous-vue. Il est donc probable qu’elle fasse un dessin personnalisé avec le tableau des titres d’index.

Ce n’est pas parfait mais j’espère que ça aide un peu.

Paul

Si votre version minimale d’iOS est plus récente que 6.0, vous pouvez utiliser la propriété UITableView de UITableView .

La couleur à utiliser pour le texte d’index de la vue de table.

@property (nonatomique, conserver) UIColor * sectionIndexColor

Discussion:

Les vues de table peuvent afficher un index sur le côté de la vue, ce qui facilite la navigation rapide des utilisateurs dans le contenu de la table. Cette propriété spécifie la couleur à utiliser pour le texte affiché dans cette région.


Date de mise à jour 2014.1.13

Je trouve une bibliothèque tierce open source: GDIIndexBar pour aider à personnaliser l’apparence de l’index.

Cela peut être facilement modifié dans le générateur d’interface pour UITableView – Pas besoin d’utiliser des classes non documentées?

Voir la capture d’écran ci-dessous, car vous pouvez voir la couleur de la police et la couleur de fond peut également être modifiée. Job est bon!

Pour iOS7 ou supérieur:

 self.tableView.sectionIndexColor = [UIColor whiteColor]; self.tableView.sectionIndexBackgroundColor = [UIColor clearColor]; 

J’avais le même problème et juste trouvé un moyen de le faire, même si cela utilise des classes et des méthodes non documentées alors pensez à une heure supplémentaire avant d’essayer de le télécharger sur l’App Store. Je devrais dire que je l’ai seulement essayé avec iOS5, donc je ne sais pas si cela fonctionnera pour les versions précédentes.

J’ai emprunté et modifié l’exemple du livre de recettes Erica Saunders pour qu’il change maintenant la couleur du texte en rouge:

 - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { for(UIView *view in [tv subviews]) { if([[[view class] description] isEqualToSsortingng:@"UITableViewIndex"]) { [view performSelector:@selector(setIndexColor:) withObject:[UIColor redColor]]; } } //rest of cellForRow handling... } 

Nous avons utilisé avec succès le code suivant:

 for(UIView *view in [tableView subviews]) { if([view respondsToSelector:@selector(setIndexColor:)]) { [view performSelector:@selector(setIndexColor:) withObject:[UIColor whiteColor]]; } } 

qui fonctionne très bien – c’est très similaire à la réponse de Mooglas – mais s’abstient d’utiliser le mot “UITableViewIndex”.

Vous pouvez définir la couleur de teinte pour la tableView.

 [[UITableView appearance] setTintColor:[UIColor purpleColor]]; 

Il y a un moyen de changer la couleur de l’index Alphabet.

Dans votre fichier d’en-tête, déclarez votre UITableView en tant que propriété:

 @property (weak, nonatomic) IBOutlet UITableView *mainTable; 

Ensuite, dans viewDidAppear de votre fichier d’implémentation, utilisez la ligne suivante:

 //Change the color of the UITableView index color _mainTable.sectionIndexColor = [UIColor blackColor]; 

Voici la meilleure solution que j’ai trouvée pour ajuster la couleur d’arrière-plan de la barre d’index sur le côté. Cela fonctionne dans iOS7 et probablement iOS6.

Ajoutez ceci à votre vueDidLoad

 if ([_tableView respondsToSelector:@selector(setSectionIndexColor:)]) { _tableView.sectionIndexBackgroundColor = [UIColor clearColor]; _tableView.sectionIndexTrackingBackgroundColor = [UIColor whiteColor]; } 

Le premier est la couleur par défaut, le second est la couleur de fond lorsque vous faites défiler.

Faire un tableau mutable pour contenir l’étiquette de titre alternatif

 -(NSArray * )sectionIndexTitlesForTableView:(UITableView * )tableView 

renvoyer un tableau de @ “” où le nombre d’espaces entre les guillemets détermine la largeur du scroller hi-lighted. Demandez à “sectionIndexTitlesForTableView” d’appeler une fonction d’étiquette de mise à jour. Dans cette fonction, supprimez toutes les étiquettes du tableau que vous avez créé précédemment à partir de leurs vues de supervision. Créez ensuite et ajoutez de nombreuses étiquettes. Puis ajoutez-les à la superview de la table.

Ce sont les lignes nécessaires pour placer les étiquettes au bon endroit.

 rect.origin.x = table.frame.origin.x+table.frame.size.width-rect.size.width-2; rect.origin.y = 5+table.frame.origin.y+counter *(280-rect.size.height-([customIndexLabels count]-1))/([customIndexLabels count]-1); if ([customIndexLabels lastObject]==thisLabel) { rect.origin.y-=10; } 

J’espère que cela pourra aider. Ce n’est pas parfait, je ne me soucie pas juste de le réparer moi-même Le problème principal est que l’espacement de la dernière étiquette n’est pas uniforme.

Swift 4.1 et Xcode 9.4:

 tableView.sectionIndexColor = .red tableView.sectionIndexBackgroundColor = .clear 

Édition rapide pour le changement de police non documenté:

 extension NSObject { class func objectClassName() -> Ssortingng { let classLongName = reflect(self.self).summary; let tokens = classLongName.componentsSeparatedBySsortingng(".") if let typeName = tokens.last { return typeName } return NSSsortingngFromClass(self.dynamicType) } } func changeSectionIndexFont(tableView: UITableView) -> Void { let realSubviews = tableView.subviews as! [UIView] for subview in realSubviews { if subview.dynamicType.objectClassName() == "UITableViewIndex" { subview.setValue(UIFont(name: "OpenSans", size: 10), forKey: "font") } } }