我正在创建基于视图的应用程序,我将通过addSubview
方法进入下一个视图。
问题是,当我打开VoiceOver的功能并添加子视图时,它会从之前的视图中获取附件标签。也就是说,如果我点击矩形中的视图,前一个视图中有标签,那么VoiceOver也会将其检测为辅助功能标签并开始读取该标签。
但是,如果我使用导航控制器去下一个视图控制器,我没有遇到任何问题。
任何人都可以告诉我,苹果本身是否仅支持基于导航的应用程序的VoiceOver工具,还是基于视图的应用程序中还有其他一些VoiceOver解决方案?
PS我在一些演示应用程序上也尝试过相同的结果,但结果相同。
因此,在当前视图中,我添加了一个包含按钮的子视图,辅助功能也会读取子视图后面的标签。我希望辅助功能可以读取添加视图上的按钮,以及前一个视图的其余可视部分(而不是标签隐藏在添加的视图后面)。 有人可以告诉,如果它是iPhone中的配音错误,默认情况下,它还会在addsubview上读取parentView的标签吗?
答案 0 :(得分:6)
如果视图位于视图层次结构中,即使它被其上的另一个视图遮挡,VoiceOver也会检测到该视图。
只需在上一个视图之上添加新视图,就不应该移动到另一个内容屏幕。您应用的每个屏幕都应该是UIViewController
,而不仅仅是普通UIView
。这为您提供了许多优势,其中之一是视图控制器可以在屏幕外时自动卸载视图并且存在内存警告。
要管理应用中屏幕之间的转换,您应该使用容器控制器,如导航控制器(或您自己的自定义控制器)。如果愿意,您可以禁用导航栏和过渡效果,并使用它来管理您的视图堆栈。当您将新的视图控制器推入堆栈时,前一个视图控制器将被删除,您的问题就会消失。
因此,您应该认真重新考虑管理屏幕和视图的方式。在某种容器内部UIViewController
是要走的路。至少,您应该在向屏幕添加新视图时删除旧视图。
答案 1 :(得分:4)
您可以将视图的accessibilityViewIsModal属性设置为YES。
@property(非原子)BOOL accessibilityViewIsModal NS_AVAILABLE_IOS(5_0);
通知辅助视图是否应被可访问性视为模态。如果是,那么 此视图外的元素将被忽略。仅显示此视图中的元素。 默认==否
所以无论你添加什么视图,都要将它的accessibilityViewIsModal设置为YES / true。
view.accessibilityViewIsModal = YES
答案 2 :(得分:3)
我和你有同样的问题,我花了一些时间来解决这个问题。 当你在视图A上添加视图B时,你没有隐藏视图A.视图在那里继续,并且正如voiceOver所期望的那样,它将读取该视图/标签。
您可以使用Xcode为您提供的调试视图来查看此类问题。我写了一个例子来说明voiceOver如何看待你的标签。
使用addSubview时,您的视图层次结构如下:
所以在这种情况下,容器视图,Hello Stack!标签位于Hello World标签上方。作为用户,您无法看到标签Hello World。然而,voiceOver可以看到该视图。
好了,现在问题已知,解决方法是:每当你想要在另一个视图上添加视图时,首先隐藏上一个视图。然后使用xcode的Debug View查看您的视图。
我解决了这个问题,向您展示如何纠正我演示的错误:
在代码中:
调试视图:
如果你是观察者,我在标签之间添加了一个视图容器,但这个视图只是为了改善层次结构的愿景。
答案 3 :(得分:2)
使用此屏幕更改通知
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
如果你需要聚焦特定的对象/视图,那么在nil处传递它们。