2012-11-19 9 views
11

więc mam UICollectionView z zestawem UICollectionViewCells wyświetlane przy użyciu niestandardowych UILayout.Voice over może tylko zobaczyć stronę o uicollectionview

mam skonfigurowane UILayout rozplanować wszystkie UICollectionViewCells niemal dokładnie takie same, jak w jaki sposób są one rozmieszczone w aplikacji Zdjęcia na iOS.

Problemem jest to, jak się wydaje, gdy Voice over jest włączony, a użytkownik przemierza przez UICollectionViewCells za pomocą machnięcia, gdy użytkownik dostaje do ostatniego widocznego komórki na stronie, i próbuje przesunąć do przodu do następnej komórki , po prostu się zatrzymuje.

Wiem, że w UITableView komórki będą tylko naprzód, a widok tabeli będą przewijać się automatycznie.

Czy ktoś wie, jak uzyskać to zachowanie?

Odpowiedz

9

Po godzinach i godzinach bólu głowy rozwiązanie było naprawdę proste. Jeśli ktoś napotka podobny problem, to co zrobiłem:

W podklasie UICollectionViewCell, którego używasz do CollectionView, zastępują accessibilityElementDidBecomeFocused i wdrożyć go tak:

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

odpowiedź Stefana pracował dla mnie! Dzięki.

Chcę dodać, że wydaje się, że dotyczy tylko iOS6; wygląda na to, że naprawili go w iOS7.

Ponadto, można dokonać przewijając nieco szybciej i czystsze przekazując ja zamiast nil do UIAccessibilityPostNotification - tak:

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

Ta odpowiedź pracował dla mnie. Dzięki!

Jest jeszcze jedno połączenie, które musisz włączyć, aby to zadziałało. W przeciwnym razie twoja metoda (void) accessibilityElementDidBecomeFocused nigdy nie zostanie wywołana. Musisz włączyć dostęp do obiektu Cell.

  1. Wariant 1: W ViewController ustaw instancji komórek mieć dostęp.

    Cell *cell = [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath]; 
    [cell setIsAccessibilityElement:YES]; 
    
  2. Wariant 2: Wdrożenie interfejs dostępu w obiekcie komórek:

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

to nie działa dla mnie, ale mogę napisać tutaj Swift wersję Kgreenek & Stephen tylko na wypadek, gdyby ktoś chciał skopiować go szybko, aby sprawdzić, czy rozwiązuje on swoje problemy.

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) 
    } 
} 
Powiązane problemy