iphone - 将触摸事件传递给 subview

标签 iphone cocoa-touch iphone-sdk-3.0

我在 UIScrollView 中有一个 View ,当用户按下某个区域时,它会加载一个附加的 subview 。当这个附加 subview 可见时,我希望所有触摸事件都由该 subview 处理,而不是由 ScrollView 处理。

看起来前几个事件是由 subview 处理的,但是随后调用了 touchesCancelled 并且 ScrollView 接管了触摸检测。

如何确保只要在该 View 上执行移动事件, subview 就能获取所有事件?

这是我在 touchesMoved 上的实现 - 我认为它可以完成这项工作...

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[touches allObjects] objectAtIndex:0];
    CGPoint touchPt = [touch locationInView:self];

    UIView *hitView = [self hitTest:touchPt withEvent:event];
    UIView *mySubView = subviewCtrl.view;

    if(hitView == mySubView) {
        [subviewCtrl.view touchesMoved:touches withEvent:event];
    }
    else {
        NSLog(@"Outside of view...");
    }
}

最佳答案

响应者链层次结构“通常”从 subview 到 super View ,因此您不需要在 super View 中进行 hitTest。您遇到的问题不是您需要 super View 来调用 subview 上的touchesMoved,而是 UIScrollView 通过拦截触摸事件来颠覆正常的响应者链层次结构,以便为用户提供平滑的滚动体验。如果您不希望出现此行为,则可以通过向 ScrollView 发送以下消息来禁用此行为:

[scrollView setDelaysContentTouches:NO];

请注意,这将确保您的 subview 首先能够处理相关事件(前提是它实际上是第一响应者)。然而,这可能会对scrollView的滚动和缩放性能产生负面影响,这可能就是Apple默认将其设置为YES的原因。

关于iphone - 将触摸事件传递给 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587832/

相关文章:

iphone - 使部分 NSString 斜体或粗体,而不是整个字符串

iphone - 应用程序崩溃,但仅在为 Ad-Hoc 发行版构建时

iphone - 如何显示 iPhone 可用内存?以及如何释放 iPhone 内存?

iphone - 如何更改 UIAlertView 中的按钮颜色

iphone - 使用 IOS 供应门户进行配置时出现问题?

iOS 保留 UIWebView 的状态?

iphone - SQLite 中的 BLOB?

iphone - 如何制作 UIBarButtonItem 动画翻转?

ios - 如果操作系统不支持底层功能,是否足以禁用工具栏按钮

iphone - 在 iOS 中更改系统时钟