首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >点的辅助功能元素

点的辅助功能元素
EN

Stack Overflow用户
提问于 2012-04-28 03:45:10
回答 4查看 452关注 0票数 0

尝试根据窗口内的CGPoint确定命中哪些(如果有的话)辅助功能元素。这个是可能的吗?一种可访问性元素命中测试...应该返回命中的任何辅助功能元素(包括系统创建的)。似乎必须有一种方法来做到这一点。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-05 04:15:44

我担心为了实现你想要的东西,你必须从根本上重新实现,比如浏览器在DOM中进行事件处理的捕获阶段:

  • 从最通用的元素开始-在任何基于UIKit的应用程序中,这将是应用程序的keyWindow,或者(如果您的应用程序是多屏幕)屏幕的最前面的窗口,您必须通过windowLevel等来确定该窗口。
  • 检查有问题的对象是否为辅助功能容器,如果是,则返回到该容器,询问适当的内容。

H19如果不是辅助功能元素,请检查它是否是辅助功能元素,如果不是,则检查F110 H111检查它的accessibility-frame是否包含question.

  • Now中的点如果是这样的话,恭喜您:您已经成功地找到了有问题的元素,所以您应该返回它。
  • 如果不是,则bail.

到目前为止,我们已经处理了可访问性的情况-元素和容器内的元素。

还有一种额外的情况需要介绍,那就是可访问性容器,它们本身就是可访问性元素:

我们有一个容器,它没有为有问题的点产生元素。

如果它是一个可访问性元素,检查它的框架是否包含point,如果包含,则返回self,如果不包含,则返回bail。

我说的保释总是指归零。

现在获取所有逻辑,将其转换为代码,并将其放入NSObject上的一个类别中。

票数 0
EN

Stack Overflow用户

发布于 2012-04-28 03:59:56

我的最佳答案是:将所有可访问性元素添加到一个数组中。在您的touchesEnded方法中,枚举数组并检查是否有任何元素被触及。一种方法是检查元素的boundingBox是否包含CGPoint。然后你可以写一堆代码来响应这种触摸!希望这能有所帮助!^_^

票数 0
EN

Stack Overflow用户

发布于 2012-06-01 21:22:28

有两种可能的方法可以做到这一点。在第一个中,您创建了一个UIView类别(新文件,类别,命名为“”,“UIView”的子类),并将以下代码放入其中:

代码语言:javascript
运行
复制
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    NSLog(@"%@", self);
}

到目前为止,这段代码可以处理所有的UIView,但不能处理它自身的所有子类。因此,您需要创建更多的子类(例如,UIControlUIWindow等)。在这些子类中,您不需要NSLog()任何东西,只需调用:

代码语言:javascript
运行
复制
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
}

因为所有这些子类都将调用超类,所以它们最终将调用UIViewNSLog()。缺点是你必须为所有的情况创建大量的子类。例如,UIControl需要UIView,然后UIButton需要UIControl,以此类推。

用另一种方式并不完全符合您的要求,但要容易得多。只需递归调用子视图即可。

代码语言:javascript
运行
复制
- (void)logView:(UIView*)v index:(int)i
{
    NSMutableString *str = [NSMutableString string];
    for (int u = 0; u<i; u++) { [str appendString:@"| "]; }
    [str appendFormat:@"<%@ %p frame:%@>", v.class, v, NSStringFromCGRect(v.frame)];
    // of course you can change it to display your accessibility hint/label
    printf("%s\n", [str UTF8String]);

    for (UIView *vv in v.subviews) { [self logView:vv index:i+1]; }
}

您只需调用此方法一次:

代码语言:javascript
运行
复制
[self logView:self.view index:0];

…它会自动创建一棵树作为输出:

代码语言:javascript
运行
复制
<UITextField 0x6b30010 frame:{{20, 13}, {280, 31}}>
| <UITextFieldRoundedRectBackgroundView 0x6b31e00 frame:{{0, 0}, {280, 31}}>
| | <UIImageView 0x6b31fe0 frame:{{0, 0}, {0, 0}}>
| | <UIImageView 0x6b32070 frame:{{0, 0}, {0, 0}}>
| | <UIImageView 0x6b320e0 frame:{{0, 0}, {0, 0}}>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10356895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档