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