- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个 View ,每个 View 包含两个 subview 。
只要两个顶 View 不重叠,命中检测就可以正常工作。因此,我可以触摸下图左侧标记为 A 的 subview 。
但是,一旦顶部的两个 View 重叠,A View 就无法接收触摸,因为 View 1“高于” View 2 并“吃掉”触摸。
View 1 和 View 2 都可以检测触摸,因为它们可以四处移动,因此需要检测 subview “之间”的触摸并对其使用react。
这意味着我的两个“顶部 View ”检测应该说:“哦,等一下,也许我正在重叠其他 View 并且应该将事件传递给它,并且只有当且仅当没有其他 View 是“低于我”的。
我该怎么做?
编辑:谢谢 jaydee3
一开始这不起作用,导致无限递归:每个 View 都推迟到其兄弟 View ,而兄弟 View 又推迟回初始 View :
- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView * hit = [super hitTest:point withEvent:event] ;
if (hit == self) {
for (UIView * sibling in self.superview.subviews) {
if (sibling != self) {
CGPoint translated = [self convertPoint:point toView:sibling] ;
UIView * other = [sibling hitTest:translated withEvent:event] ;
if (other) {
return other ;
}
}
}
}
return hit ;
}
所以,我添加了一个“标记集”来跟踪已经访问过的 View ,现在一切正常了:)
- (UIView *) hitTest: (CGPoint) point withEvent: (UIEvent *) event {
static NSMutableSet * markedViews = [NSMutableSet setWithCapacity:4] ;
UIView * hit = [super hitTest:point withEvent:event] ;
if (hit == nil) return nil ;
if (hit == self) {
for (UIView * sibling in hit.superview.subviews) {
if (sibling != hit) {
if ([markedViews containsObject:sibling]) {
continue ;
}
[markedViews addObject:sibling] ;
CGPoint translated = [hit convertPoint:point toView:sibling] ;
UIView * other = [sibling hitTest:translated withEvent:event] ;
[markedViews removeObject:sibling] ;
if (other) {
return other ;
}
}
}
}
return hit ;
}
最佳答案
为您的 View 创建一个自定义子类(包含其他两个 subview )并为它覆盖 hitTest:
方法。在该方法中,检查 hitTest View 是否是两个 subview 之一,否则返回 nil
。因此,在您的周围 View 中,所有触摸都将被忽略。导致触摸下面的 View ,它可以自行处理。
//编辑:(您通过调用 UIView* view = [super hitTest:withEvent:];
获得 hitTest View 。)
//edit2:我想的更多::)
- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView * hit = [super hitTest:point withEvent:event] ;
if (hit == self) {
return nil;
}
return hit ;
}
;)
关于ios - 重叠的 UIView 上的 UITouch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9871372/
我正在尝试制作一个函数,以便当鸟接触其中一根管道时应该发生一些事情(我稍后会写下来)但是我马上就遇到了一个错误,我不知道如何修复它。 出现错误的是“UITouch”部分我已经尝试将多个不同的代码放在那
我想让每个UITouch实例记录一次点击。换句话说,无论多次点击发生得有多近,我都希望它们各自创建一个唯一的触摸实例。这可能吗? 谢谢, 道格 最佳答案 这个问题的背后是我需要为每个点击将唯一地址与每
我在写作时使用多点触控,所以基本上我所做的是,我在手部支持下写作,因为通常情况下,它是用户书写的方式,我点击了此链接 How to ignore certain UITouch Points in m
我有以下问题: 如果我用一根手指(即中指)点击触摸屏并靠近手指向上的那一刻,我用第二根手指(即食指)点击靠近另一根手指所在的区域,而不是获得向下事件,我的第一根手指移动到 第二根手指的向下位置。重现有
我想设置一个全局 UITouch 处理程序来调试正在通过系统的所有 UITouch 事件以及哪个 View 是目标等。我该如何实现? 最佳答案 创建一个 UIApplication 的子类来覆盖 se
我有一个大图像(1024, 1496)作为我的图层的背景图像。所以我开始显示图像的按钮。在应用时,我显示了图像的顶部和一些 CCSprites。 id move = [CCMoveBy actionW
您将如何设置模拟 UITouches 的回归测试? 我正在开发一款 iOS 游戏,希望对核心功能进行一些回归测试。我需要自动触发对 touchesBegan:(NSSet *)touches with
我有一个 UIView,在他上面我有 UIButton、UITableView 和 UINavigationBar。我想要做的是,当您单击 UIButton 并拖动它时,所有 View 将仅移动到左侧
因为我非常喜欢今天关于在 Swift 中创建我自己的可以生成对象实例的类的新手教程。我希望通过在这些知识的基础上开始使用 Apple 的 Cocoa Touch API's 来变得更好。然而,在阅读
我正在构建一个允许用户在屏幕上绘图的应用程序。我想添加网络功能,以便用户 A 可以在用户 B 的屏幕上绘图。我目前的计划是构建一个系统,在其中我拥有自己的 UserOrNetworkTouch 对象,
我正在尝试检测触摸移动的速度,但并不总能得到预期的结果。 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ s
如何在 touchmoved 函数中获取手指移动的速度和方向? 我想获取手指速度和手指方向并将其应用于 UIView 类方向移动和动画速度。 我阅读了这个链接,但我无法理解答案,此外它也没有解释我如何
我希望在应用程序中从一个 subview 拖动到另一个 subview (并用一条线连接它们),因此我需要跟踪用户触摸的当前 View 。 我认为我可以通过简单地在touchesMoved方法中调用[
我正在尝试调试游戏中一些与 TouchBegan/Moved/Ended 相关的减速问题;我认为我的一些触摸响应器没有正确卸载,因此随着游戏在越来越多的触摸响应器上运行,触摸响应器会变得越来越不响应,
我有一个父 UIView 和一个子 UIView,我想让触摸从子传递到父,并由两个 View 处理。 y-------------- | parent | | x------ | |
这基本上是我试图生成图像或敌人的代码,我想删除它们,但不是通过只触摸所触摸的相同图像之一来一次性删除它们。这张图片也在移动,以防有人需要知道。 import SpriteKit import UIKi
我想从左侧和右侧创建一个节点,当我触摸它们时,小鸟会飞向左侧或右侧。 首先我创建了一个鸟节点 然后,我创建了测试节点 var groundleft = SKSpriteNode() groundlef
我无法让 UIView 通过多次触摸来响应我想要的方式。基本上某些 UITouches 在 UITouchPhaseBegan 中,但永远不会进入 UITouchPhaseEnded 或 UITouc
如何在 iOS 中使用 UITouch 检测圆形点击? - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
我正在使用CGContext画一条线。我已将线宽设置为35。现在,当调用 touches begin 时,我正在记录触摸点。但它只给出一个点,我想要触摸内的所有点,因为我的线宽是35。如何一次获得所有
我是一名优秀的程序员,十分优秀!