UIPageControl и VoiceOver / доступность - PullRequest
8 голосов
/ 02 апреля 2012

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

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

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

Ответы [ 2 ]

8 голосов
/ 04 марта 2014

Я вложил в подкласс 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
4 голосов
/ 29 декабря 2014

Если вы поддерживаете 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, эта цель / действие будет по-прежнему вызываться, но индикатор точки текущей страницы не будет обновляться.

...