我在iPad上遇到触摸检测问题。
我将UIImageView子类化为:
@interface MyUIImageView : UIImageView
{
BOOL _dragActive;
CGPoint originalLocation;
}
@end
@implementation MyUIImageView
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
_dragActive = YES;
originalLocation = self.center;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if (_dragActive)
{
UITouch* touch = [touches anyObject];
self.center = [touch locationInView:self.superview];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if (_dragActive)
{
self.center = originalLocation;
}
_dragActive = NO;
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
if (_dragActive)
{
self.center = originalLocation;
}
_dragActive = NO;
}
@end
我在控制器视图上并排显示多个ImageView(MyUIImageView)控件,但我的touchesBegan仅在最前面调用,尽管它们在控制器视图中是分开的。
看起来有一个不可见的“检测层”,它会在ImageViews之外产生。
当我单击并拖动ImageView时,拖动的是左侧或右侧的那个,具体取决于哪个位于前面。如果我改变了z轴,那么行为会重复,但会在前面的图像上重复。
答案 0 :(得分:1)
我没有清楚地了解您的确切要求。如果您只是希望检测特定imageView(即最左侧或最右侧的图像视图)的触摸,而不是尝试将该对象分配到UITouch而不是使用任何对象 - >
UITouch * touch = [触及anyObject];
使用这种方式,如果它工作UITouch * touch = [touches imgViewObject];
答案 1 :(得分:1)
对于您所描述的情况,您应该考虑让控制器(其视图包含所有图像视图)处理触摸事件。我认为你所描述的“检测层”实际上是你的imageview在触摸事件流开始时所占据的屏幕区域。我相信,父视图可以更好地重新定位imageview(拖动)。
这种方法的一个好处是,您可以更轻松地处理重新布置兄弟视图,在父视图边界定义行为,从超视图的角度执行您计划对兄弟碰撞/重叠等做的任何事情。
答案 2 :(得分:0)
最后我已经解决了这个问题。我试图移动的UIImageViews比Image有更大的背景。这干扰了兄弟图像的触摸检测。
在“界面”构建器中,如果我设置背景颜色,它按预期工作,但在运行时它变得更大。我注意到这是通过以编程方式将背景颜色设置为灰色。
在Interface Builder中更改UIImageViews的自动调整大小解决了这个问题。