UIActivityIndi​​catorView

时间:2015-07-27 23:30:42

标签: accessibility uiactivityindicatorview voiceover

我正在尝试为UIActivityIndi​​catorView(在我的视图控制器viewDidLoad中以编程方式创建)提供可访问性标签。我将辅助功能标签设置为:

myIndicatorView.accessibilityLabel = @"Please wait, processing"

但是当我运行应用程序时,语音总是会读取"正在进行中#34;。我尝试使用辅助功能检查器在模拟器上进行调试,但每次指示器视图处于焦点时,它的标签为"正在进行中"。我假设,"正在进行中"是活动指标视图的默认语音文本,但我无法更改此标签。我想知道活动指示器视图的可访问标签是否永远不会被更改。 如果有人遇到这个问题并找到了解决方法,那么请帮助我。

2 个答案:

答案 0 :(得分:5)

并不是说你没有改变它。这就是说,在后台,随着进度指示器的状态发生变化,iOS后端会将标签更新为适当的状态。这取决于您更改它的内容,因为在您更改状态后它可能会应用自己的更新。

我会把这件事留下来。与“正在进行中”相比,“请等待,处理”不提供其他信息。并且“进行中”是VoiceOver用户习惯于听到“进行中”状态进度指示器宣布的方式。更改此公告是针对一个没有视力的用户,将图像更改为旋转的米老鼠头的内容将会被发现。

如果你必须改变它,你想要做的不是设置属性,而是覆盖属性的getter方法的实现。为此,请提供UIActivityIndi​​catorView的自定义实现,以执行以下操作。

@interface MyActivityIndicator : UIActivityIndicatorView

@end

@implementation MYActivityIndicator

- (NSString*)accessibilityLabel {
    if (self.isAnimating) {
        return NSLocalizedString("ACTIVITY_INDICATOR_ACTIVE", nil);
    } else {
        return NSLocalizedString("ACTIVITY_INDICATOR_INACTIVE", nil);
    }
}

答案 1 :(得分:0)

Swift 中的

UIActivityIndicatorView子类

根据控件的状态,accessibilityLabelUIActivityIndicatorView getter的实现是动态的。因此,如果您设置了accessibilityLabel,则可能会稍后更改。

以下UIActivityIndicatorView子类会覆盖accessibilityLabel的默认实现。它基于@ChrisCM在Objective C中的答案。

class MyActivityIndicatorView: UIActivityIndicatorView {

    override var accessibilityLabel: String? {
        get {
            if isAnimating {
                return NSLocalizedString("ACTIVITY_INDICATOR_ACTIVE", comment: "");
            }
            else {
                return NSLocalizedString("ACTIVITY_INDICATOR_INACTIVE", comment: "");
            }
        }

        set {
            super.accessibilityLabel = newValue
        }
    }
}

在我的应用中,活动指示器仅在动画时在屏幕和VoiceOver上可见。因此,我只需要一个accessibilityLabel值。除非明确设置,否则以下子类使用accessibilityLabel的默认动态实现。如果设置,则无论状态如何,它都会使用该值。

class MyActivityIndicatorView: UIActivityIndicatorView {

    private var accessibilityLabelOverride: String?

    override var accessibilityLabel: String? {
        get {
            if accessibilityLabelOverride != nil {
                return accessibilityLabelOverride
            }

            return super.accessibilityLabel
        }

        set {
            accessibilityLabelOverride = newValue
        }
    }
}

// Example use
let activityIndicatorView = MyActivityIndicatorView(activityIndicatorStyle: .gray)
activityIndicatorView.accessibilityLabel = NSLocalizedString("ACTIVITY_INDICATOR", comment: "")