【问题标题】:Accessibility/Voice over Requirement on UIActivityIndicatorViewUIActivityIndi​​catorView 上的可访问性/语音要求
【发布时间】:2015-07-27 23:30:41
【问题描述】:

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

myIndicatorView.accessibilityLabel = @"Please wait, processing"

但是当我运行应用程序时,画外音总是显示“进行中”。我尝试使用可访问性检查器在模拟器上进行调试,但每次指示器视图处于焦点时,它的标签都会显示为“进行中”。我假设,“进行中”是活动指示器视图的默认文本语音,但我无法更改此标签。我想知道活动指示器视图的可访问标签是否永远无法更改。 如果有人遇到此问题并找到解决方法,请帮助我。

【问题讨论】:

  • 在 Xcode 8.1 中,在可视化编辑器中(它仍然称为 Interface-builder 吗?)我的 UIActivityIndi​​catorView 没有“可访问性”部分。 (其他按钮、标签和其他视图确实有这样的部分)。 Apple 是否决定 UIActivityIndi​​catorView 应该保持通用,除非被代码子类化和覆盖?甚至没有标签将“视频加载进度指示器”作为角色(而“按钮”将在按钮等上进行叙述)。我该如何自定义?

标签: accessibility uiactivityindicatorview voiceover


【解决方案1】:

并不是你没有改变它。就是在后台,随着进度指示器状态的变化,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);
    }
}

【讨论】:

  • 我同意保留默认标签
  • 非常感谢!我想覆盖活动指示器的可访问性行为的唯一原因是让受损人员知道是否正在拨打服务电话。而不是说正在进行中,我想做一些更具体的事情,比如“正在检索帐户详细信息”或类似的“列表调用已进行..请等待响应”(更具体到 Web API 调用类型)
【解决方案2】:

UIActivityIndicatorView Swift 中的子类

UIActivityIndicatorView 中的 accessibilityLabel 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: "")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多