我的应用程序中有一个UIScrollview,我用大量的UIImageViews填充它大约900.它们都非常小,一次又一次只包含两个不同的图像。
现在我在检测其中一个UIImageViews上的触摸时遇到了很多麻烦。
我已经为他们分配了一个独特的标签,以便能够区分它们,但我真的很难发现触摸。
目标只是能够改变所触摸的UIImageView的图像。
由于涉及大量视图,因此只需在每个UIImageViews框架上进行简单的循环检查触摸坐标即可暂停我的应用程序。
有人有任何建议吗?
先谢谢。
本
答案 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
{
}