Accessibility/Voice 超过 UIActivityIndicatorView 的要求
Accessibility/Voice over Requirement on UIActivityIndicatorView
我正在尝试为 UIActivityIndicatorView(它是在我的视图控制器 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 方法的实现。为此,请提供执行以下操作的 UIActivityIndicatorView 的自定义实现。
@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
中的子类
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
}
}
}
在我的应用程序中,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: "")
我正在尝试为 UIActivityIndicatorView(它是在我的视图控制器 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 方法的实现。为此,请提供执行以下操作的 UIActivityIndicatorView 的自定义实现。
@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
中的子类
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
}
}
}
在我的应用程序中,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: "")