VoiceOver 在 iPhone 应用程序中读取上一个视图上的标签?漏洞?

Posted

技术标签:

【中文标题】VoiceOver 在 iPhone 应用程序中读取上一个视图上的标签?漏洞?【英文标题】:VoiceOver reads labels on previous view in iPhone app? bug? 【发布时间】:2012-03-26 22:38:02 【问题描述】:

我正在创建基于视图的应用程序,我将通过addSubview 方法进入下一个视图。 问题是,当我打开 VoiceOver 的功能并添加子视图时,它会从以前的视图中获取附件标签。也就是说,如果我单击矩形的视图,在以前的视图中有标签,那么,VoiceOver 也会将其检测为可访问性标签并开始阅读该标签。 但是,如果我使用导航控制器转到下一个视图控制器,我不会遇到任何问题。 谁能告诉我,如果苹果本身只支持基于导航的应用程序的 VoiceOver 功能,或者在基于视图的应用程序中是否有其他 VoiceOver 解决方案?

PS 我也在一些演示应用上尝试过相同的方法,但结果相同。

因此,当我在当前视图中添加包含按钮的子视图时,可访问性也会读取子视图后面的标签。我希望可以访问添加视图上的阅读按钮,以及仅前一个视图的其余可见部分(而不是标签隐藏在添加的视图后面)。 有人可以告诉,如果它是 iPhone 中的画外音错误,默认情况下,它也会在 addsubview 上读取 parentView 的标签?

【问题讨论】:

您的隐藏标签是放置在您的视图中并选中了隐藏复选框,还是您已将它们导入到 xib 或情节提要中,并且它们仅存储在侧栏上? 我的标签隐藏在添加的视图后面。我现在只是在我的问题中详细说明了它。我在当前视图上添加子视图,其中包含按钮,这个子视图后面有一些标签,画外音也在读取这些标签,这是不应该发生的。 没有。我在 xib 中创建了不同的视图(包含标签、按钮、图像)以及一个主视图,并在需要时将任何一个视图添加到主视图。 您最好的选择可能是尝试在您调用加载子视图的方法中释放标签。 每次释放标签都可以,但是会非常复杂,手动删除每个在视图中变得不可见的标签,然后在需要显示它们时再次添加它们。我想,应该有一些解决方案来阻止画外音阅读后视图上的标签(在 addSubView 之后)?因为,即使我在添加另一个 viewController 的 subView 时,画外音也会从以前的视图中读取标签,这是画外音中的错误吗? 【参考方案1】:

如果一个视图在视图层次结构中,即使它被上面的另一个视图遮挡,VoiceOver 也会检测到这一点。

您不应该仅仅通过在前一个视图之上添加一个新视图来移动到另一个内容屏幕。你的应用程序的每个屏幕都应该是一个UIViewController,而不仅仅是一个普通的UIView。这给你带来了很多好处,其中之一是视图控制器可以在它离开屏幕并且出现内存警告时自动卸载它的视图。

要管理应用中屏幕之间的转换,您应该使用容器控制器,如导航控制器(或您自己的自定义控制器)。如果您愿意,您可以禁用导航栏和过渡效果,并使用它来管理您的视图堆栈。当您将新的视图控制器压入堆栈时,前一个视图控制器将被删除,您的问题就会消失。

因此,您应该认真重新考虑管理屏幕和视图的方式。 UIViewController 在某种容器内是要走的路。至少,当您向屏幕添加新视图时,您应该移除旧视图。

【讨论】:

***.com/questions/48587155/… 有什么想法吗?【参考方案2】:

您可以将视图的 accessibilityViewIsModal 属性设置为 YES。

@property (nonatomic) BOOL 可访问性ViewIsModal NS_AVAILABLE_ios(5_0);

通知接收视图是否应被视为可访问性的模式。如果是,那么 此视图之外的元素将被忽略。只有这个视图内的元素会被暴露。 默认 == 否

所以无论您要添加什么视图,请将它的 accessibilityViewIsModal 设置为 YES / true。

view.accessibilityViewIsModal = YES

【讨论】:

【参考方案3】:

使用此屏幕更改通知

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);

如果您需要关注特定对象/视图,则将它们传递到 nil 的位置。

【讨论】:

我们需要在哪里添加这一行? 只有完全相同的行,否则我们需要改变一些东西? 是的,这将通知辅助功能用户已更改屏幕,因此它不会考虑前一个屏幕。 在最新版本的 iOS 中已更改为 UIAccessibility.post(notification: .screenChanged, argument: nil)【参考方案4】:

我和你有同样的问题,我花了一些时间来解决这个问题。 当您在视图 A 上添加视图 B 时,您不会隐藏视图 A。视图会继续存在,并且正如 VoiceOver 所期望的那样,它将读取该视图/标签。

您可以使用 Xcode 为您提供的 Debug View 来查看此类问题。我写了一个例子来演示 VoiceOver 如何看到你的标签。

当您使用 addSubview 时,您的视图层次结构是这样的:

所以在本例中,容器视图带有 Hello Stack!标签位于 Hello World 标签之上。作为用户,您看不到标签 Hello World。但是,voiceOver 可以看到该视图。

好的,既然问题已经知道了,解决办法是:每当你想在另一个视图上添加一个视图时,首先隐藏前一个视图。然后使用 xcode 的 Debug View 看看你的视图如何。

我修复它是为了向您展示如何纠正我演示的错误:

在代码中:

调试视图:

第一个标签:postimg.org/image/cabhadzrl/ 第二个标签:postimg.org/image/nsldgjb41/5605fbcd/

如果你观察,我在标签之间添加了一个视图容器,但这个视图只是为了改善层次结构的视觉。

【讨论】:

我喜欢你的积极态度,但我想使用模态视图。所以我不希望我背后的观点变得透明。

以上是关于VoiceOver 在 iPhone 应用程序中读取上一个视图上的标签?漏洞?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 iOS 应用中启用或禁用 VoiceOver?

VoiceOver:如何在计算器中实现类似于键的按钮

我可以影响 VoiceOver 转子中显示的内容吗?

如何将自定义视图添加到 iOS VoiceOver 转子?

UIPageControl 和 VoiceOver/辅助功能

如何更改 VoiceOver 对我的应用程序的发音?