6

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

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

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

4

4 回答 4

8

如果视图位于视图层次结构中,即使它被位于其顶部的另一个视图遮挡,VoiceOver 也会检测到这一点。

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

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

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

于 2012-03-27T13:24:57.547 回答
5

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

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

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

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

view.accessibilityViewIsModal = YES

于 2016-03-02T05:34:57.240 回答
4

使用此屏幕更改通知

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);

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

于 2014-01-10T09:01:30.807 回答
3

我和你有同样的问题,我花了一些时间解决这个问题。当您在视图 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/

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

于 2015-05-26T18:02:56.570 回答