Accessibility/Voice 超过 UIActivityIndi​​catorView 的要求

Accessibility/Voice over Requirement on UIActivityIndicatorView

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

myIndicatorView.accessibilityLabel = @"Please wait, processing"

但是当我运行申请时,画外音总是读"in progress"。我尝试使用可访问性检查器在模拟器上进行调试,但每次指示器视图处于焦点时,它的标签为 "in progress"。我假设,"in progress" 是 activity 指标视图的默认语音文本,但我无法更改此标签。我想知道 activity 指示器视图的可访问标签是否永远无法更改。 如果有人遇到这个问题并找到了解决方法,请帮助我。

不是你不改。就是这样,在后台,随着进度指示器的状态发生变化,iOS 后端将标签更新为适当的状态。这将覆盖您将其更改为的任何内容,因为它可能会在您更改状态后应用自己的更新。

我就不管这个了。与 "In progress" 相比,"Please wait, processing" 没有提供额外的信息。 "In progress" 是 VoiceOver 用户习惯于听到 "In progress" 状态进度指示器宣布的方式。将此公告更改为视力不佳的用户,将图像更改为旋转的米老鼠头对视力正常的用户来说是什么。

如果您必须更改它,您要做的不是设置 属性,而是覆盖 属性 的 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);
    }
}

UIActivityIndicatorView Swift

中的子类

UIActivityIndicatorViewaccessibilityLabel 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
        }
    }
}

在我的应用程序中,activity 指示器仅在动画时在屏幕上和 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: "")