如何在UIScrollview中检测UIImageView上的触摸?

时间:2011-02-18 14:01:14

标签: iphone objective-c uiscrollview uiimageview touchesbegan

我的应用程序中有一个UIScrollview,我用大量的UIImageViews填充它大约900.它们都非常小,一次又一次只包含两个不同的图像。

现在我在检测其中一个UIImageViews上的触摸时遇到了很多麻烦。

我已经为他们分配了一个独特的标签,以便能够区分它们,但我真的很难发现触摸。

目标只是能够改变所触摸的UIImageView的图像。

由于涉及大量视图,因此只需在每个UIImageViews框架上进行简单的循环检查触摸坐标即可暂停我的应用程序。

有人有任何建议吗?

先谢谢。

4 个答案:

答案 0 :(得分:4)

在我的情况下,最简单的方法是添加一个手势识别器:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
//Default value for cancelsTouchesInView is YES, which will prevent buttons to be clicked
singleTap.cancelsTouchesInView = NO; 
[myScrollView addGestureRecognizer:singleTap];   

然后使用此方法捕捉触摸:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
  { 
    CGPoint touchPoint=[gesture locationInView:myScrollView];
  }

答案 1 :(得分:3)

默认情况下,UIImageView的触控处理已关闭。要将userInteractionEnabled设置为YES(请参阅此处的文档http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIImageView_Class/Reference/Reference.html

此外,如果您想知道在视图层次结构中点击了哪个视图,您可以使用hitTest:withEvent:(请参阅UIView中的文档),这将比循环遍历层次结构快得多。

更广泛地说,我不认为屏幕上同时拥有900个UIImageView将是一个很好的长期策略。您是否曾调查过通过CoreGraphics绘制屏幕的内容?

答案 2 :(得分:0)

您可以在UIImageView对象上轻松实现此方法:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
      //You clicked inside the object
    }
    return [super hitTest:point withEvent:event]
}

使用return告诉应用程序下一个触摸响应者(例如uiimageview或scrollview)。

答案 3 :(得分:0)

解决此问题的最佳方法是将UIScrollView子类化,向其添加touchesBegan等方法。

@interface MyScroll : UIScrollView
 {

 }