6

几天前我将我的 iPad 升级到了 5.0,同时将 Xcode 升级到了 4.2,这样我就可以继续测试我的应用程序了。现在,我在使用以前版本的 Xcode 的几个应用程序中遇到了触摸代码问题。

我将 UIImageView 子类化以通过覆盖-(void)TouchesBegan和添加一些拖动功能-(void)TouchesMoved。我没有子类中覆盖-(void)TouchesEnded,而是在包含图像视图的视图的视图控制器中处理了它。

我将子类拉到UIImageView一个新项目中进行测试,并将问题缩小到父级UIView(由 Xcode 创建的模板)似乎没有将触摸事件转发到视图控制器(也是由 Xcode 创建)的事实。

如果我将它添加到我的子类中:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touches ended event in ImageToDrag");
    [self.nextResponder touchesEnded:touches withEvent:event];
}

这是我父视图的视图控制器:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touches ended event in ViewController");
}

当我放开我在屏幕上拖动的图像时,我得到了"touches ended event in ImageToDrag",但不是来自视图控制器的日志。

但是,如果我通过在子类视图中执行此操作有意跳过视图:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touches ended event in ImageToDrag");
    [[self.nextResponder nextResponder] touchesEnded:touches withEvent:event];
}

然后我得到两个日志条目。

我能想出的唯一解释是,由于某种原因,UIView正在消耗touchesEnded事件而不是将其传递给视图控制器。

我已经验证exclusiveTouch设置为NO,并且在父视图和子类上userInteractionEnabled设置为。YESUIImageView

我还测试了 iOS 5.0 和 iOS 4.2 的编译,并将测试应用程序部署到 iOS 5 iPad 和 iOS 4.3.1 iPad。

我能够获得触摸事件的唯一方法viewController是跳过视图并nextResponder在子类中使用双精度。尽管该方法有效,但对我来说似乎是一种黑客行为,我相信它稍后会回来咬我。

有没有其他人看到过这种行为?有什么方法可以让我找出UIView我的触摸事件在做什么?

谢谢,丹

4

2 回答 2

5

在过去的几个小时里,我一直在尝试寻找类似的问题。终于在这篇文章的帮助下设法解决了

实际上,看起来我只是设法解决了它,使用来自 https://devforums.apple.com/message/519690#519690
的提示 早些时候,我只是将 touchesEnded 事件转发给 self.nextResponder。当我添加具有与 touchesEnded 类似实现的 touchesBegan、Moved、Canceled 处理程序时,该事件似乎会冒泡到根视图控制器。
所以我猜在 iOS5 上,当他们没有看到相关的 touchesBegan 时,视图会丢弃 touchesEnded 事件。

我不需要添加 Moved/etc.,我只是在 TouchesBegan 上转发,然后 TouchesEnded 再次开始工作!

于 2011-10-19T13:36:28.497 回答
2

一些触摸处理在 iOS 5.0 中确实有机会;特别是如果您将应用程序重新链接到 5.0 SDK。

UIView 的触摸处理方法有一节是这样说的:

如果您在不调用 super 的情况下覆盖此方法(一种常见的使用模式),那么您还必须覆盖用于处理触摸事件的其他方法,如果只是作为存根(empy)实现。

所以如果你做一个,你需要把它们都做完。我知道 UIKit 开始采取措施确保在 5.0 中是这种情况。

所以我会从那里开始 - 覆盖你视图上的所有方法,看看会发生什么。

于 2011-10-17T00:17:35.537 回答