【发布时间】:2011-10-16 20:04:52
【问题描述】:
几天前我将 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 在父视图和子类UIImageView 上设置为YES。
我还测试了 iOS 5.0 和 iOS 4.2 的编译,并将测试应用程序部署到 iOS 5 iPad 和 iOS 4.3.1 iPad。
我能够获得viewController 的触摸事件的唯一方法是跳过视图并在子类中使用双nextResponder。尽管该方法有效,但对我来说似乎是一种 hack,我相信它稍后会回来咬我。
还有其他人看到过这种行为吗?有什么方法可以让我找出UIView 对我的触摸事件做了什么?
谢谢, 丹
【问题讨论】: