2012-11-19 8 views
11

So habe ich eine UICollectionView mit einer Reihe von UICollectionViewCells mit einem benutzerdefinierten UILayout angezeigt.Voiceover kann nur eine Seite einer uicollectionview sehen

Ich habe die UILayout konfiguriert, um alle UICollectionViewCells fast genau so zu legen, wie sie in der Fotos App auf ios ausgelegt sind. Das Problem ist, scheint es, wenn Voice-Over aktiviert ist, und der Benutzer durch die UICollectionViewCells mit Swipe durchläuft, wenn der Benutzer die letzte sichtbare Zelle auf der Seite erreicht, und versucht, auf die nächste Zelle zu wischen Es hört einfach auf.

Ich weiß, dass in UITableView die Zellen einfach weiter vorwärts gehen, und die Tabellenansicht wird automatisch nach unten scrollen.

Kann jemand dieses Verhalten erhalten?

Antwort

9

Nach stundenlangen Kopfschmerzen war die Lösung wirklich einfach. Wenn jemand anderes über ein ähnliches Problem kommt, ist es das, was ich tat:

In der Unterklasse von UICollectionViewCell, die Sie für Ihre Collection verwenden, außer Kraft setzen accessibilityElementDidBecomeFocused und implementieren es wie folgt aus:

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

Stephen Antwort gearbeitet für mich! Vielen Dank.

Ich möchte hinzufügen, dass dies nur iOS6 betrifft; es sieht so aus, als hätten sie es in iOS7 behoben.

Sie können aber auch das Scrollen etwas schneller und sauberer durch Selbst vorbei statt Null zu UIAccessibilityPostNotification machen - etwa so:

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

Diese Antwort für mich gearbeitet, auch. Vielen Dank!

Es gibt noch einen weiteren Anruf, den Sie aktivieren müssen, damit dies funktioniert. Andernfalls wird Ihre Methode (void) accessibilityElementDidBecomeFocused nie aufgerufen. Sie müssen die Zugriffsmöglichkeit für das Objekt Zelle aktivieren.

  1. Option 1: Stellen Sie in ViewController die Zelleninstanz so ein, dass sie zugänglich ist.

    Cell *cell = [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath]; 
    [cell setIsAccessibilityElement:YES]; 
    
  2. Option 2: Implementieren Sie die Accessibility-Schnittstelle in der Zelle Objekt: nur

    - (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

Es ist nicht für mich arbeiten, aber ich poste hier die Swift-Version von Kgreenek & Stephen falls jemand es kopieren möchte, fügen Sie es schnell ein, um zu überprüfen, ob es seine Probleme behebt.

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) 
    } 
}