2012-11-19 7 views
11

Quindi ho un UICollectionView con un set di UICollectionViewCells visualizzato utilizzando un UILayout personalizzato.voice over può vedere solo una pagina di una vista uicollection

Ho configurato UILayout per disporre tutte le UICollectionViewCells quasi esattamente come sono disposte nell'app Foto su ios.

Il problema è che sembra quando il voice over è attivato e l'utente sta attraversando UICollectionViewCells utilizzando lo scorrimento, quando l'utente raggiunge l'ultima cella visibile sulla pagina e prova a passare in avanti alla cella successiva , semplicemente si ferma.

So che in UITableView le celle continueranno a spostarsi in avanti e la vista tabella scorrerà automaticamente verso il basso.

Qualcuno sa come ottenere questo comportamento?

risposta

9

Dopo ore e ore di mal di testa, la soluzione era davvero semplice. Se qualcun altro si imbatte in un problema simile, questo è quello che ho fatto:

Nella sottoclasse di UICollectionViewCell che si sta utilizzando per la vostra CollectionView, ignorare accessibilityElementDidBecomeFocused e implementare in questo modo:

- (void)accessibilityElementDidBecomeFocused 
{ 
    UICollectionView *collectionView = (UICollectionView *)self.superview; 
    [collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally|UICollectionViewScrollPositionCenteredVertically animated:NO]; 
    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil); 
} 
1

risposta di Stephen ha lavorato per me! Grazie.

Voglio aggiungere che questo sembra interessare solo iOS6; sembra che l'abbiano risolto in iOS7.

Inoltre, è possibile effettuare lo scorrimento leggermente più veloce e più pulito passando sé, invece di zero a UIAccessibilityPostNotification - in questo modo:

- (void)accessibilityElementDidBecomeFocused {  
    UICollectionView *collectionView = (UICollectionView *)self.superview; 
    [collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally|UICollectionViewScrollPositionCenteredVertically animated:NO]; 
    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self); 
} 
15

Questa risposta ha funzionato per me, anche. Grazie!

C'è un'altra chiamata che deve essere abilitata per farlo funzionare. Altrimenti il ​​metodo (void) accessibilityElementDidBecomeFocused non verrà mai chiamato. È necessario abilitare l'accessibilità sull'oggetto Cell.

  1. Opzione 1: In ViewController, impostare l'istanza cella per avere accessibilità.

    Cell *cell = [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath]; 
    [cell setIsAccessibilityElement:YES]; 
    
  2. Opzione 2: Implementare l'interfaccia di accessibilità nell'oggetto delle cellule:

    - (BOOL)isAccessibilityElement 
    { 
        return YES; 
    } 
    
    - (NSString *)accessibilityLabel { 
        return self.label.text; 
    } 
    
    - (UIAccessibilityTraits)accessibilityTraits { 
        return UIAccessibilityTraitStaticText; // Or some other trait that fits better 
    } 
    
    - (void)accessibilityElementDidBecomeFocused 
    { 
        UICollectionView *collectionView = (UICollectionView *)self.superview; 
        [collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally|UICollectionViewScrollPositionCenteredVertically animated:NO]; 
        UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self); 
    } 
    
0

non ha funzionato per me, ma ho posto qui la versione Swift di Kgreenek & Stephen solo nel caso qualcuno voglia copiare copia incolla velocemente per verificare se risolve i suoi problemi.

override func accessibilityElementDidBecomeFocused() { 
    if let superview = self.superview as? UICollectionView, let indexPath = superview .indexPath(for: self) { 
      superview.scrollToItem(at: indexPath, at: [.centeredVertically, .centeredHorizontally], animated: false) 
      UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self) 
    } 
} 
Problemi correlati