我实际上知道如何做到这一点,但我这样做的方式让我想到了两个真正的问题。首先,我在 UIButton 子类中更改此框架,如下所示:
- (CGRect)accessibilityFrame {
CGRect rect = [self.superview convertRect:self.frame toView:nil];
rect.size.width *= 5;
return rect;
}
如果我省略此方法的第一行,那么此按钮的辅助功能框架将出现在屏幕的绝对左上角,无论其原始位置如何。我找到的所有用于覆盖可访问性框架的代码示例都使用了坐标转换的一些变体,但我完全不明白为什么。为什么不能在与 View 框架相同的坐标系中处理此属性,因为这会使修改辅助功能框架变得非常简单?
我的第二个问题与此辅助功能框架在启用 VoiceOver 的情况下如何实际运行有关。当我以这种方式修改辅助功能框架时,焦点矩形会按预期变大。不幸的是,这种效果似乎纯粹是装饰性的。即使焦点矩形现在比按钮本身大得多,我仍然只能通过在按钮边界内适当点击来将焦点应用到按钮;如果我点击焦点矩形内部但按钮本身之外,什么也不会发生。这对我来说是个大问题,因为我试图扩大一些控件的“虚拟”大小,这些控件非常小,除非您能看到它们,否则很难实际点击。如果视力受损的用户无论如何都看不到焦点矩形,那么我完全不理解使焦点矩形仅在外观上更大的意义。
编辑: 添加这个位就可以了:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGPoint newPoint = [self.superview convertPoint:point toView:nil];
return CGRectContainsPoint(self.accessibilityFrame, newPoint);
}
我仍然很想知道为什么需要这样的东西。
编辑 2: 上面的代码只适用于特殊情况(在多个嵌套 subview 中)。更通用的解决方案是:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGPoint newPoint = [self convertPoint:point toView:nil];
return CGRectContainsPoint(self.accessibilityFrame, newPoint);
}
最佳答案
可访问性框架在屏幕坐标 ( see documentation ) 中指定。
转换
-[UIView convertRect:toView:]
如果 toView 为 nil,则将 View 坐标转换为窗口坐标。
为了 100% 正确,使用
从窗口坐标到屏幕坐标的额外转换-[UIWindow convertPoint:toWindow:]
(同样,toWindow 为 nil)将是必需的。
现在,您可能已经知道需要在 VoiceOver 光标内双击才能触发按钮的操作。默认情况下,双击点击辅助功能框架的中心。但是,如果您修改后的辅助功能框架的中心不在您的按钮上,则什么也不会发生。方便的是,accessibilityActivationPoint
方法允许您将该中心放在其他地方(例如,就在按钮的实际中心上)。同样,不要忘记转换为屏幕坐标。
在开始制作巨大的辅助功能框架之前需要考虑的一件事:如果您的按钮非常小,普通用户也可能很难点击它们。考虑使它们(或至少它们响应触摸的区域)更大。 Apple recommends至少 44 x 44 点。
关于ios - 如何创建不同于 View 边界的 accessibilityFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033906/