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

3
我在我的应用程序中有一个UIScrollview,并用大量的UIImageViews(约900个)填充它。它们都非常小,仅由两个不同的图像重复组成。
现在我遇到了很多麻烦,无法检测出这些UIImageViews中的一个触摸。
我已经为它们分配了唯一的标记,以便能够区分它们,但我真的很难检测到触摸。
目标就是能够更改所触摸的UIImageView的图像。
由于涉及大量视图,简单的循环检查每个UIImageView的框架的触摸坐标会使我的应用程序挂起。
有人有什么建议吗?
提前感谢。
Ben

给图像视图添加手势识别器? - Jake
4个回答

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];
  }

3

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

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

在更广泛的范围内,我认为一次性在屏幕上拥有900个UIImageView不会是一个好的长期策略。您是否已经通过CoreGraphics绘制屏幕内容?


我已将userInteractionEnabled设置为YES。我尝试了以下代码:`code- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; int i = [[touch view] tag]; NSLog(@"Touched views tag is: %d",i);}` 但现在的问题是它只能检测到不在UIScrollView上的视图上的触摸。我该如何使其检测UIScrollView中的触摸?谢谢Ben - Ben O'Dwyer

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)。

0

解决这个问题的最佳方法是子类化UIScrollView,添加touchesBegan等方法。

@interface MyScroll : UIScrollView
 {

 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接