Подтвердить что ты не робот

Голос может видеть только страницу uicollectionview

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

Я настроил UILayout, чтобы выложить все UICollectionViewCells почти точно так же, как и то, как они выложены в приложении photos на ios.

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

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

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

4b9b3361

Ответ 1

Этот ответ тоже работал у меня. Спасибо!

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

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

    Cell *cell = [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath];
    [cell setIsAccessibilityElement:YES];
    
  • Вариант 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);
    }
    

Ответ 2

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

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

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

Ответ 3

Ответ Стивена помог мне! Спасибо.

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

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

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

Ответ 4

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

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