2010-11-09 4 views
8

Peu importe ce que j'essaie, je ne peux pas empêcher mon UITableViewCell personnalisé d'agir comme comme il le devrait sous les règles par défaut pour UIAccessiblity. Je ne veux pas que cette cellule agisse comme un conteneur d'accessibilité (en soi), donc en suivant ce guide je devrais être capable de rendre tous mes sous-vues accessibles, non?! Il dit de rendre chaque élément accessible séparément et de s'assurer que la cellule elle-même n'est pas accessible.Problème UITableViewCell personnalisé avec les éléments UIAccessibility

- (BOOL)isAccessibilityElement 
{ 
    return NO; 
} 

- (NSString *)accessibilityLabel 
{ 
    return nil; 
} 

- (NSInteger)accessibilityElementCount 
{ 
    return 0; 
} 


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier //cells use this reusage stuff 
{ 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) 
    { 
     [self setIsAccessibilityElement:NO]; 
     sub1 = [[UILabel alloc] initWithFrame:CGRectMake(0,0,1,1)]; 
     [sub1 setAccessibilityLanguage:@"es"]; 
     [sub1 setIsAccessibilityElement:YES]; 
     [sub1 setAccessibilityLabel:sub1.text] 

     sub2 = [[UILabel alloc] initWithFrame:CGRectMake(0,0,1,1)]; 
     [sub2 setAccessibilityLanguage:@"es"]; 
     [sub2 setIsAccessibilityElement:YES]; 
     [sub2 setAccessibilityLabel:sub2.text] 

La voix sur le système lit le contenu de la cellule entière à la fois, même si je suis en train d'arrêter ce comportement. Je pourrais dire

 [sub2 setIsAccessibilityElement:NO]; 

mais cela rendrait cet élément entièrement illisible. Je veux qu'il reste lisible, mais que la cellule entière ne soit pas traitée comme un conteneur (et supposée être la langue anglaise). Il ne semble pas y avoir beaucoup d'informations là-dessus, donc à tout le moins j'aimerais le documenter.

+1

Savez-vous si son récursive à travers les sous-vues? –

+0

Comme si vous définissiez IESAccessibilityElement sur YES, cela dit-il tout? –

Répondre

12

Si vous avez 2 éléments distincts (sub1 et sub2), vous pouvez remplacer les méthodes du protocole informel UIAccessibilityContainer.

- (NSInteger)accessibilityElementCount { 
    return 2; 
} 

- (id)accessibilityElementAtIndex:(NSInteger)index { 
    if (index == 0) { 
     return sub1; 
    } else if (index == 1) { 
     return sub2; 
    } 
    return nil; 
} 

- (NSInteger)indexOfAccessibilityElement:(id)element { 
    if (element == sub1) { 
     return 0; 
    } else if (element == sub2) { 
     return 1; 
    } 
    return NSNotFound; 
} 
+0

J'ai déjà fait ça avant et ça a marché. C'est une vraie douleur. –

+0

Lub vous, vous êtes génial :) – thndrkiss

+1

Le dernier 'return 0;' dans 'indexOfAccessibilityElement:' devrait être: 'return NSNotFound;' – plu

0

Dans iOS 8 ou plus récent, on peut simplement définir la propriété accessibilityElements:

// A list of container elements managed by the receiver. 
// This can be used as an alternative to implementing the dynamic methods. 
@available(iOS 8.0, *) 
public var accessibilityElements: [AnyObject]? 
Questions connexes