2012-11-19 8 views
11

Итак, у меня есть UICollectionView с набором UICollectionViewCells, отображаемым с использованием пользовательского UILayout.голос поверх может видеть только страницу uicollectionview

Я настроил UILayout, чтобы выложить все UICollectionViewCells почти точно так же, как они были размещены в приложении для фотографий на ios.

Проблема заключается в том, что, когда голос включен, и пользователь проходит через UICollectionViewCells, используя салфетки, когда пользователь добирается до последней видимой ячейки на странице и пытается перейти к следующей ячейке , он просто останавливается.

Я знаю, что в UITableView ячейки будут продолжать движение вперед, и таблица будет автоматически прокручиваться вниз.

Кто-нибудь знает, как получить такое поведение?

ответ

9

После нескольких часов и часов головной боли решение было очень простым. Если кто-то попадается подобной проблемой, это то, что я сделал:

В подклассе UICollectionViewCell, которые вы используете для CollectionView, переопределить accessibilityElementDidBecomeFocused и реализовать это следующим образом:

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

ответ Стивен работал для меня! Благодарю.

Я хочу добавить, что это влияет только на iOS6; похоже, они исправили его в iOS7.

Кроме того, вы можете сделать немного быстрее и чище прокрутки, передавая себя вместо нуля до UIAccessibilityPostNotification - вот так:

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

Этот ответ работал для меня тоже. Благодаря!

Существует еще один звонок, который вы должны включить, чтобы заставить его работать. В противном случае ваш метод (void) accessibilityElementDidBecomeFocused никогда не будет вызван. Вы должны включить доступность объекта Cell.

  1. Вариант 1: В ViewController установите для экземпляра ячейки доступность.

    Cell *cell = [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath]; 
    [cell setIsAccessibilityElement:YES]; 
    
  2. Вариант 2: Реализовать интерфейс доступности в объекте клеток:

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

Это не работает для меня, но я отправляю здесь Swift версия Kgreenek & Стивен просто в случае, если кто-то захочет скопировать его быстро, чтобы проверить, разрешает ли он свои проблемы.

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