iOS 8.4:滚动视图在视图出现后立即启用Voice Over重置contentOffset

时间:2016-01-14 15:21:52

标签: ios scrollview accessibility voiceover contentoffset

启用Voice Over后,滚动视图会在显示视图后第二次重置其预设contentOffset。它发生在iOS 8.4设备上,没有9.0的再现。看起来一些内部UIScrollViewAccessibility代码强制将焦点滚动到setContent:时为零。没有办法逃避这个。

有什么想法吗?

相关代码示例说明了该错误。 只需创建一个包含集合视图的视图,创建一个具有重用ID“Cell”的单元格并在其上添加标签。

@interface ViewController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>
@property (nonatomic, weak) IBOutlet UICollectionView *collectionView;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.collectionView.backgroundColor = [UIColor clearColor];
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.collectionView reloadData];
    //set there 4 seconds and bug will disappear
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:5 inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
    });
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"Why you scroll second time?");
}
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return self.view.bounds.size;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 10;
}
- (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    UILabel *label = (UILabel*)cell.contentView.subviews[0];
    label.text = @(indexPath.item + 1).stringValue;
    if (indexPath.item == 5) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{           UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, label);
        });
    }
    return cell;
}
@end

1 个答案:

答案 0 :(得分:1)

这是故意这样做的。如果用户使用滑动手势进行导航。如果您导航到滚动视图,则应该聚焦视图中的第一个元素。对于视力正常的VoiceOver用户来说,显然不会向上滚动到顶部,因为可能你的焦点矩形可能在屏幕外。这是一个功能,而不是错误。