在启用VoiceOver的MKMapView上触发touchesBegan

时间:2010-11-19 01:18:58

标签: cocoa-touch ios4 accessibility voiceover

作为一项具有可访问性和个人挑战的练习,我决定写一个相对简单的应用程序。

该应用会显示美国的MKMapView,当您点按其上的任意位置时,它会使用MKReverseGeocoder向您显示您点按的地点,州和国家/地区。虽然我必须通过向WildcardGestureRecognizer添加MKMapView来劫持触摸事件,但这样可以正常工作。关闭VoiceOver时效果很好。

当我打开VoiceOver并点按地图时,它会显示“地图”。如果我双击它会产生一点点噪音,这表示你已经激活了它。说实话,我对如何拦截这些事件感到茫然。我知道一般的解决方案是在整个屏幕上方放置透明视图并向下传递触摸,但这是否适用于VoiceOver

为了记录,我在这里找到WildcardGestureRecognizerHow to intercept touches events on a MKMapView or UIWebView objects?

2 个答案:

答案 0 :(得分:2)

问题是当您打开VoiceOver时,系统会阻止触摸事件。为了证明这一点,请在touchesBegan函数中添加一些跟踪。在你打开VoiceOver之前它应该会正常闪烁。

双击时听到的轻微咔哒声是VoiceOver重叠手势。 VoiceOver有自己的一组手势,但你可以通过双击保持覆盖VoiceOver的手势。

例如,向下滑动不会在启用VoiceOver的情况下滚动页面。但如果你双击,等待咔哒声,然后向下滑动,它就会滚动。

答案 1 :(得分:2)

iOS 5.0添加了此功能 - 只需在视图上设置UIAccessibilityTraitAllowsDirectInteraction特征:

mapView.accessibilityTraits |= UIAccessibilityTraitAllowsDirectInteraction;

(如果这不起作用,您可能需要子类化地图视图并覆盖accessibilityTraits方法)

该元素的第一次触摸仍会发出“咔嗒”声并宣布视图名称等,但所有后续触摸都将是直接交互 - 即触摸事件将传递到地图视图。

在Apple的iOS应用程序中使用的示例是GarageBand - 钢琴视图具有此特性设置,以便盲人可以通过直接触摸它来弹奏钢琴键盘上的按键。