具有多个UIImageView的touchesbegan检测到不正确的UIImageView

时间:2010-12-01 14:26:42

标签: iphone objective-c ipad ios drag-and-drop

我在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轴,那么行为会重复,但会在前面的图像上重复。

3 个答案:

答案 0 :(得分:1)

我没有清楚地了解您的确切要求。如果您只是希望检测特定imageView(即最左侧或最右侧的图像视图)的触摸,而不是尝试将该对象分配到UITouch而不是使用任何对象 - >
UITouch * touch = [触及anyObject];
使用这种方式,如果它工作UITouch * touch = [touches imgViewObject];

答案 1 :(得分:1)

对于您所描述的情况,您应该考虑让控制器(其视图包含所有图像视图)处理触摸事件。我认为你所描述的“检测层”实际上是你的imageview在触摸事件流开始时所占据的屏幕区域。我相信,父视图可以更好地重新定位imageview(拖动)。

这种方法的一个好处是,您可以更轻松地处理重新布置兄弟视图,在父视图边界定义行为,从超视图的角度执行您计划对兄弟碰撞/重叠等做的任何事情。

答案 2 :(得分:0)

最后我已经解决了这个问题。我试图移动的UIImageViews比Image有更大的背景。这干扰了兄弟图像的触摸检测。

在“界面”构建器中,如果我设置背景颜色,它按预期工作,但在运行时它变得更大。我注意到这是通过以编程方式将背景颜色设置为灰色。

在Interface Builder中更改UIImageViews的自动调整大小解决了这个问题。