iOS 8.4: представление прокрутки сбрасывает contentOffset с включенным Voice Over вскоре после появления представления

При включенной функции Voice Over прокрутки представления сбрасывают свой предустановленный контент Offset через секунду после появления представления. Это происходит на устройствах iOS 8.4, нет воспроизведения для 9.0. Выглядит какой-то внутренний UIScrollViewAccessibility код заставляет прокрутить вид на setContent: для нуля, когда становится сосредоточенным. Не нашел способа избежать этого.

Какие-нибудь мысли?

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

@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 ответ

Это делает это намеренно. Если пользователи используют жесты смахивания для навигации. Если вы переходите в представление прокрутки, первый элемент в представлении должен быть сфокусирован. Для зрячих пользователей VoiceOver, очевидно, не прокручивание вверх до верху может вызвать раздражение, так как потенциально ваш прямоугольник фокусировки может быть вне экрана. Это особенность, а не ошибка.

Другие вопросы по тегам