Ios UIView触摸处理行为随Xcode 4.2而改变?

Ios UIView触摸处理行为随Xcode 4.2而改变?,ios,ios5,xcode4.2,Ios,Ios5,Xcode4.2,几天前,我将iPad升级到5.0,同时将Xcode升级到4.2,以便继续测试我的应用程序。现在,我在使用以前版本的Xcode的几个应用程序中遇到了触摸代码的问题 我将UIImageView子类化,通过覆盖-(void)touchsbegind和-(void)touchsmoved来添加一些拖动功能。我没有重写子类中的-(void)touchesend,而是在包含图像视图的视图的视图控制器中处理了该问题 我将子类UIImageView拉到一个新项目中进行测试,并将问题缩小到父类UIView(由Xc

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

我将UIImageView子类化,通过覆盖
-(void)touchsbegind
-(void)touchsmoved
来添加一些拖动功能。我没有重写子类中的
-(void)touchesend
,而是在包含图像视图的视图的视图控制器中处理了该问题

我将子类
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");
}
当我放开在屏幕上拖动的图像时,我会在ImageToDrag中获得
“touchs end”事件,但不会从视图控制器获得日志

但是,如果我在子类视图中故意跳过视图:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touches ended event in ImageToDrag");
    [[self.nextResponder nextResponder] touchesEnded:touches withEvent:event];
}
然后我得到两个日志条目

我能想到的唯一解释是,出于某种原因,
UIView
正在使用
touchesend
事件,而不是将其传递给视图控制器

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

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

我能够将触摸事件发送到
viewController
的唯一方法是跳过视图并在子类中使用双
nextResponder
。虽然这种方法很有效,但对我来说,它似乎是一种黑客行为,我相信它会在以后再次攻击我

还有谁见过这种行为吗?是否有任何方法可以让我了解
UIView
如何处理我的触摸事件

谢谢,
Dan

在iOS 5.0中,一些触摸操作的确是偶然的;尤其是当您将应用程序与5.0 SDK重新链接时

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

如果在不调用super(一种常用模式)的情况下重写此方法,则还必须重写处理触摸事件的其他方法(如果仅作为存根(empy)实现)

所以,如果你只做一件事,你就需要做所有的事。我知道UIKit开始采取措施确保5.0中的情况是这样


因此,我从这里开始——覆盖视图中的所有方法,看看会发生什么。

在过去的几个小时里,我一直在努力追踪类似问题的答案。最后在他的帮助下解决了这个问题

事实上,看起来我只是利用了
早些时候,我只是 已将touchesEnded事件转发给self.nextResponder。当我加上 触摸开始、移动、取消具有类似实现的处理程序 当触摸结束时,事件似乎会冒泡到根视图 控制器。
所以我猜在iOS5上,视图丢弃了touchesedend事件 当他们没有看到相关的接触开始


我不需要添加Moved/etc,我只需在TouchsStart上转发,然后TouchsEnd重新开始工作

我正在覆盖子类中的touchsbegind和touchsmove…但不是touchscancelled。我会试试看它是否会清除。我也尝试过覆盖视图中的touchesCancelled,但如果不使用double nextResponder,它仍然无法工作。这成功了。关键是我必须在处理完事件后将其转发到superview。另一个注意事项是我必须使用“super”而不是“self.nextResponder”才能让它工作。谢谢你的回答。在这件事上把我的头发扯得乱七八糟。