什么被调用而不是 - (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 当辅助功能(画外音打开)的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式约束时uiview不绘图

如何重新加载 UIView?

UIVIew/CALayer 动画期间的回调

如何防止 UIView.animate 被调用

在 UIView 外部(而不是内部)添加边框

popViewController 适用于一个视图,而不是另一个