什么被调用而不是 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 当辅助功能(画外音打开)
Posted
技术标签:
【中文标题】什么被调用而不是 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 当辅助功能(画外音打开)【英文标题】:What gets called instead of - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event when Accessibility(voice over is on) 【发布时间】:2017-01-09 00:57:07 【问题描述】:最近我在 UIViews 方法中放了一个断点
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
方法并检查当用户在画外音打开时点击 UIView 时编译器是否在此处停止,但它从未到达断点,有谁知道调用了什么以及如何拦截触摸?
【问题讨论】:
【参考方案1】:VoiceOver 开启时不使用标准的 hitTest 机制。相反,UIView 有一个_accessibilityHitTest:withEvent:
方法,但与 macOS 不同,它是私有的,不能轻易被覆盖或调用。
与 hitTest 类似,_accessibilityHitTest
使用 _accessibilityPointInside:withEvent:
,而后者又调用 pointInside:withEvent:
(它是公开的)。
【讨论】:
【参考方案2】:首先,请注意,启用 VoiceOver 时,用户必须双击“激活”或“点击”视图。如果您仍然没有打到hitTest:…
,那么请继续使用acccessibilityActivate()
。这是双击触发的默认辅助功能操作。您可能还对activationPoint
感兴趣,这是 VoiceOver 在激活时发出的模拟触摸的默认位置。请注意,激活点并不与所有 VoiceOver 交互相关(例如,adjustable
控件)。
【讨论】:
如果你激活了一个可访问的元素,这意味着你触发了accessibilityActivate
,你在其中定义了你的代码。但是accessibilityActivationPoint
的兴趣是什么,因为以前的方法必须做任何你想做的事情?在包含其他元素的自定义元素中,VoiceOver 会激活焦点元素,不是吗?我真的不明白这个activationPoint
是如何工作的,即使在阅读了文档之后也是如此。无论如何,在我看来,这种行为应该实现可访问性操作......
@XLE_22 activationPoint
对于没有明确实现accessibilityActivate
的元素很有用。
我必须承认我不明白activationPoint
是如何工作的,因为在我的理解中,双击只会激活焦点元素。 VoiceOver 不知道包含所有这些元素的选定元素中可能还有哪些其他元素。那么,VoiceOver 如何解释那些他不知道的内部元素呢?【参考方案3】:
hit-test 视图首先有机会处理触摸事件。如果命中测试视图无法处理事件,则事件会沿着该视图的响应者链向上传播,如“响应者链由响应者对象组成”中所述,直到系统找到可以处理它的对象。请看this。
【讨论】:
以上是关于什么被调用而不是 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 当辅助功能(画外音打开)的主要内容,如果未能解决你的问题,请参考以下文章