我有一个UITableViewController,我试图自定义节标题看起来更像纯文本.我发现当我向自定义headerView添加子视图(详见下文)时,它会破坏VoiceOver标题导航.
例如:假设我有一个包含三个标题的表:Header1,Header2,Header3.
如果没有viewForHeaderInSection方法的自定义实现,我可以切换画外音转子以按标题导航,一切都按预期工作.
当我以下面的方式实现viewForHeaderInSection方法时,我可以从Header1移动到Header2到Header3并返回到Header2,但是然后画外音丢失所有标题(说"找不到标题").
当我将headerLabel作为子视图添加到headerView时,我发现问题就出现了.我已经尝试将headerLabel设置为隐藏的辅助功能元素,因此画外音不会提取它,但问题仍然存在.
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)];
headerLabel.textAlignment = UITextAlignmentLeft;
headerLabel.font = [UIFont boldSystemFontOfSize:22];
headerLabel.text = [headersArray objectAtIndex:section];
headerLabel.backgroundColor = [UIColor clearColor];
[headerView addSubview:headerLabel];
return headerView;
}
Run Code Online (Sandbox Code Playgroud)
任何有关VoiceOver如此反应的想法都将受到赞赏.
谢谢.
我正在创建基于视图的应用程序,我将通过addSubview方法进入下一个视图.问题是,当我打开VoiceOver的功能并添加子视图时,它会从之前的视图中获取附件标签.也就是说,如果我点击矩形中的视图,前一个视图中有标签,那么VoiceOver也会将其检测为辅助功能标签并开始读取该标签.但是,如果我使用导航控制器去下一个视图控制器,我没有遇到任何问题.任何人都可以告诉我,如果苹果本身仅支持基于导航的应用程序的VoiceOver工具,或者在基于视图的应用程序中还有其他一些VoiceOver解决方案吗?
PS我也在一些演示应用程序上尝试过相同的结果.
因此,在当前视图中,我添加了一个包含按钮的子视图,辅助功能也会读取子视图后面的标签.我希望辅助功能可以读取添加视图上的按钮,以及前一个视图的其余可视部分(而不是标签隐藏在添加的视图后面).有人可以告诉,如果它是iPhone中的配音错误,默认情况下,它还会在addsubview上读取parentView的标签吗?
我其实知道如何做到这一点,但我这样做的方式让我想到了两个真正的问题.首先,我在UIButton子类中更改此框架,如下所示:
- (CGRect)accessibilityFrame {
CGRect rect = [self.superview convertRect:self.frame toView:nil];
rect.size.width *= 5;
return rect;
}
Run Code Online (Sandbox Code Playgroud)
如果省略此方法的第一行,则此按钮的辅助功能框将显示在屏幕的绝对左上角,而不管其原始位置如何.我发现的覆盖可访问性框架的所有代码示例都使用了一些坐标转换的变体,但我完全不理解为什么.为什么不能在与视图框架相同的坐标系中处理此属性,因为这会使修改辅助功能框架变得非常简单?
我的第二个问题涉及这个辅助功能框架在启用VoiceOver时的实际功能.当我以这种方式修改辅助功能框架时,焦点矩形会按预期变大.不幸的是,这种效果似乎纯粹是装饰性的.即使焦点矩形现在比按钮本身大得多,我仍然只能通过点击正确的按钮边界将焦点应用于按钮; 如果我点击焦点矩形内部但在按钮本身之外,则没有任何反应.这对我来说是一个大问题,因为我试图扩展一些控件的"虚拟"尺寸,这些控件非常小,除非你能看到它们,否则它们很难实际敲击.如果瞄准障碍的用户无论如何都看不到它,那么我不能理解使焦点矩形只在美观上更大的方面.
编辑:添加此位可以解决问题:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGPoint newPoint = [self.superview convertPoint:point toView:nil];
return CGRectContainsPoint(self.accessibilityFrame, newPoint);
}
Run Code Online (Sandbox Code Playgroud)
我仍然想知道为什么这样的事情甚至是必要的.
编辑2:上面的代码仅适用于特殊情况(在多个嵌套的子视图中).更通用的解决方案是:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGPoint newPoint = [self convertPoint:point toView:nil];
return CGRectContainsPoint(self.accessibilityFrame, newPoint);
}
Run Code Online (Sandbox Code Playgroud) 启用VoiceOver后,用户可以使用3指滑动手势滚动TableView.VoiceOver口头向用户宣布一个短语,表示他们在桌面视图上的位置,即可见的行,例如"第1行到第4行".
我想覆盖这个口头提示并获得画外音,向用户宣布其他内容.
我正在做一些滚动的VoiceOver实验(三指向上/向下滑动手势).
我的测试页面位于:
http://107.170.41.208/AccessibleHTML
Run Code Online (Sandbox Code Playgroud)
有一个带滚动条和大量内容(红色背景)的div,然后是另一个不能滚动的内容很多的内容(黄色背景).
使用鼠标,我可以滚动浏览红色背景内容,但使用VoiceOver会跳过该部分.
如何使用VoiceOver滚动红色部分内容?
我正在尝试使我的 Voice Over 的 UIPickerView 可访问,我注意到 UIPickerViewAccessibilityDelegate 协议相当不完整。它只允许您为 pickerView 组件指定标签和提示,而不是组件内的行。(它也有一个错误,它的 pickerView:accessibilityLabelForComponent: 方法没有在它的 pickerView 参数中传递 UIPickerView*,而是一个 UIAccessibilityPickerComponent !)
所以我现在想知道,有没有办法为我的选择器的行设置自定义可访问性标签,还是只能读出屏幕上显示的实际选择器行值?
我正在尝试做一个选择器视图,显示时间,小时,分钟,秒。我无法让 datePicker 做到这一点。但是,如果每一行都可以在旁白中说“3 小时”而不是 3 小时,那就太好了。如果我必须将可见标签设置为我希望旁白读出的内容,那么我不确定标签将适合显示这一点,即。
15 小时 35 分 20 秒
非常适合用英语显示在屏幕上,不确定本地化后它会增长多大..因此能够为每一行设置标签的理想选择。
干杯
我有UIAlertController一个消息。我希望警报消息可访问性标签与警报消息字符串不同。
我怎样才能做到这一点?
我有一个 UIImageView 作为视图的背景。用户交互被禁用。isAccessibilityElement 设置为 NO。当应用程序在设备上运行时,可以使用调试视图层次结构来验证这一点。
然而,当我点击以该背景为背景的视图时,会描述其上的所有控件,然后使用自动图像识别来描述图像。我在网上找到的所有内容都说这是 iOS 14 的一项新功能,而且非常棒,但没有提到如何关闭它。
我什至尝试设置自己的描述字符串,至少尝试覆盖图像识别,但无济于事。那么 - 有没有办法为特定的 UIImageView(甚至整个应用程序)关闭它,如果可以,如何关闭?
*** 更新 ****
所以我已经确认这是特定于 iOS 14 的。我有以下代码viewDidLoad:
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"blueSky.jpg"]];
imageView.isAccessibilityElement = YES;
imageView.accessibilityLabel = @"I am not a description";
CGPoint origin = imageView.frame.origin;
origin.y = 50;
origin.x = 50;
CGRect imageFrame = imageView.frame;
imageFrame.origin = origin;
imageView.frame = imageFrame;
self.view.isAccessibilityElement = NO;
[self.view addSubview:imageView];
Run Code Online (Sandbox Code Playgroud)
blueSky 是蓝天的图像。它不使用资产目录。当我在 iOS 13 中启用 VoiceOver 的情况下点击图像时,它会显示“我不是描述”。当我在 iOS 14.1 设备上点击它时,它会显示“我不是描述”,然后停顿半秒,说“图像”,然后继续描述它“蓝天,多云”。这是我一生都无法弄清楚如何消除的最后一部分!
我们有以下(简化的)HTML:(
真正的 HTML 稍微复杂一些,但listitem元素与下面的代码片段中所示完全相同。)
<div role="list">
<div role="listitem">Foo</div>
<div role="listitem">Bar</div>
<div role="listitem">Baz</div>
</div>
Run Code Online (Sandbox Code Playgroud)
当用户向下浏览列表时,VoiceOver 会宣布:
在 macOS 10.14(莫哈韦沙漠)上:
Foo,组
Bar,组
Baz,组
在 macOS 10.15 (Catalina) 上:
Foo,空组
Bar,空组
Baz,空组
两个 macOS 上的 VoiceOver 配置似乎相同,那么为什么 VoiceOver 对于相同的标记会说不同的内容呢? (这个GitHub 问题似乎描述了类似的情况。)
对于 SwiftUI Image 元素,配音模板似乎是“辅助功能标签 - 图像 - 图像名称”,例如
var body: some View {
Image(systemName: "equal")
.accessibilityLabel("my label")
}
Run Code Online (Sandbox Code Playgroud)
我收到画外音响应“我的标签图像相等”。
画外音是否可以只说“我的标签”,而不发音“图像相等”部分?
voiceover ×10
ios ×8
css ×1
html ×1
ios5 ×1
iphone ×1
javascript ×1
swift ×1
swiftui ×1
tableview ×1
uiimageview ×1
uipickerview ×1
uitableview ×1
wai-aria ×1