【问题标题】:touchesbegan with multiple UIImageView detects incorrect UIImageViewtouchesbegin with multiple UIImageView 检测到不正确的 UIImageView
【发布时间】:2010-12-01 14:26:42
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我不清楚您的确切要求。如果您只想为特定的 imageView(即最左边或最右边的 imageview)检测触摸,而不是尝试将该对象分配给 UITouch 而不是使用任何对象 -> UITouch* touch = [触摸任何对象];
    如果可行,请使用这种方式 UITouch* touch = [touches imgViewObject];

    【讨论】:

    • 我将实施您提议的更改,看看它是如何工作的,谢谢。
    【解决方案2】:

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

    这种方法的一个好处是,您可以更轻松地处理重新排列同级视图、定义父视图边界处的行为、执行您计划从超级视图的角度对同级冲突/重叠执行的任何操作等。

    【讨论】:

    • 我最初的方法是按照你描述的方式,但我遇到了完全相同的问题。
    【解决方案3】:

    我终于解决了这个问题。我试图移动的 UIImageViews 的背景比图像更大。这会干扰兄弟图像的触摸检测。

    如果我在界面生成器中设置背景颜色,它会按预期工作,但在运行时它会变大。我通过以编程方式将背景颜色设置为灰色注意到了这一点。

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

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 2015-08-29
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多