15

所以我有一个 UICollectionView 和一组 UICollectionViewCells 使用自定义 UILayout 显示。

我已经将 UILayout 配置为所有 UICollectionViewCells 的布局几乎与它们在 ios 上的照片应用程序中的布局方式完全相同。

问题是,似乎当打开语音时,用户正在使用滑动遍历 UICollectionViewCells,当用户到达页面上的最后一个可见单元格并尝试向前滑动到下一个单元格时,它只是停止.

我知道在 UITableView 中,单元格将继续向前移动,并且表格视图将自动向下滚动。

有谁知道如何获得这种行为?

4

4 回答 4

22

这个答案也对我有用。谢谢!

您必须启用另一个调用才能使其正常工作。否则,您的方法 (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);
    }
    
于 2013-11-06T21:51:54.947 回答
13

经过数小时的头痛之后,解决方案非常简单。如果其他人遇到类似的问题,这就是我所做的:

在您用于 CollectionView 的 UICollectionViewCell 的子类中,覆盖accessibilityElementDidBecomeFocused 并像这样实现它:

- (void)accessibilityElementDidBecomeFocused
{
    UICollectionView *collectionView = (UICollectionView *)self.superview;
    [collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally|UICollectionViewScrollPositionCenteredVertically animated:NO];
    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);
}
于 2012-11-20T13:10:37.107 回答
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);
}
于 2013-10-02T23:00:58.783 回答
2

这就是你在 Swift 中的做法:

override func accessibilityElementDidBecomeFocused() {
    guard let collectionView = superview as? UICollectionView,
        let indexPath = collectionView.indexPath(for: self) else {
        return
    }

    collectionView.scrollToItem(at: indexPath, at: .left, animated: true)
    UIAccessibility.post(notification: .layoutChanged, argument: nil)
}
于 2018-10-29T11:23:11.510 回答