3

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

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

我为它们都分配了一个唯一的标签,以便能够区分它们,但我真的很难检测到触摸。

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

由于涉及大量视图,一个简单的循环检查每个 UIImageViews 框架的触摸坐标只是挂起我的应用程序。

有没有人有什么建议?

提前致谢。

4

4 回答 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];
  }
于 2011-12-20T20:02:35.850 回答
3

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

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

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

于 2011-02-18T14:06:41.820 回答
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)。

于 2011-02-18T14:08:30.320 回答
0

解决这个问题的最好方法是继承 UIScrollView,给它添加 touchesBegan 等方法。

@interface MyScroll : UIScrollView
 {

 }
于 2011-10-17T12:01:55.037 回答