UIPageControl и VoiceOver/доступность

При использовании голоса за кадром на трамплине, когда выбран UIPageControl в нижней части экрана, VoiceOver объявляет что-то вроде «Страница 1 из 5. Регулируемый». и пользователь может проводить вверх и вниз, чтобы менять страницы.

В моем приложении я не получаю часть «Регулируемая», и страницы не могут быть изменены смахиванием.

Есть идеи, как мне это исправить? Очевидно, это убивает удобство использования приложения.


person Dan Wesnor    schedule 01.04.2012    source источник
comment
Вы делаете это в InterfaceBuilder или программно? Похоже, ему не хватает черты UIAccessibilityTraitAdjustible — вы используете Page Control напрямую или внутри другого представления, которое знает, как им управлять?)   -  person Kaolin Fire    schedule 20.04.2012


Ответы (3)


Я создал подкласс UIPageControl и переопределил геттер -accessibilityTraits, чтобы вернуть UIAccessibilityTraitAdjustable, чтобы Voice Over читался как «регулируемый».

Чтобы добавить действия: реализуйте методы -accessibilityIncrement и -accessibilityDecrement, указанные в категории UIAccessibilityAction.

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

Образец кода

@interface AccessibleUIPageControl : UIPageControl

@end

@implementation AccessibleUIPageControl

- (UIAccessibilityTraits)accessibilityTraits
{
    return super.accessibilityTraits | UIAccessibilityTraitAdjustable;
}

- (void)accessibilityIncrement
{
    self.currentPage = self.currentPage + 1;
    [self sendActionsForControlEvents:UIControlEventValueChanged];
}

- (void)accessibilityDecrement
{
    self.currentPage = self.currentPage - 1;
    [self sendActionsForControlEvents:UIControlEventValueChanged];
}

@end
person micap    schedule 04.03.2014
comment
Обычно вы объедините черты из super с нужными чертами, например return super.accessibilityTraits | UIAccessibilityTraitAdjustable. - person Adrian; 18.05.2015

Если вы поддерживаете iOS 9 и более поздние версии, это поведение теперь является стандартом и не требует специальной обработки.

Если вы поддерживаете iOS 8 и более ранние версии, создайте подкласс UIPageControl и переопределите accessibilityIncrement и accessibilityDecrement. Вам не нужно переопределять свойство accessibilityTraits, чтобы указать, что оно настраивается — UIPageControl настраивается по умолчанию.

import UIKit

class AccessibleUIPageControl: UIPageControl {

    override func accessibilityIncrement() {
        self.currentPage += 1
        self.sendActionsForControlEvents(.ValueChanged)
    }

    override func accessibilityDecrement() {
        self.currentPage -= 1
        self.sendActionsForControlEvents(.ValueChanged)
    }

}

Затем в вашем контроллере представления вы можете прослушивать ValueChanged и реагировать соответствующим образом, чтобы отобразить содержимое для новой страницы:

//viewDidLoad:
self.pageControl.addTarget(self, action: "didChangePage", forControlEvents: .ValueChanged)

func didChangePage() {
    let contentOffset: CGFloat = collectionView.frame.size.width * CGFloat(pageControl.currentPage)
    collectionView.setContentOffset(CGPointMake(contentOffset, 0), animated: false)
}

Обратите внимание, что если вы не создадите подкласс UIPageControl, эта цель/действие все равно будет вызываться, но индикатор точки текущей страницы не будет обновляться.

person Jordan H    schedule 28.12.2014
comment
Привет, проблема, с которой я столкнулся при управлении страницей, заключается в том, что я не могу заставить его увеличивать или уменьшать счетчик, когда на нем находится фокус. Я ориентируюсь на платформы iOS 10 и выше. Любой способ помочь мне? Спасибо! - person Karthik Kannan; 26.02.2018
comment
@KarthikKannan Извините, я сам не видел эту проблему - person Jordan H; 27.02.2018

Мне все еще нужно было реализовать Custom AccessiblePageControl с помощью iOS 10+ (как было предложено выше). Я следовал описанному выше подходу, но связал IBAction на моей раскадровке как для touchUpInside, так и для valueChanged.

person Jiebe    schedule 22.07.2019