我如何检测UIImageView的触摸事件
我已经在导航栏上放置了一个图像(UIImageView)。 现在我想检测触摸事件,并想要处理事件。 你能让我知道我该怎么做?
谢谢。
实际上,不要这样做。
而是在UIImageView上添加一个具有自定义样式的button(除非指定了图像,否则不需要buttongraphics)。 然后附加任何你想调用的方法。
你可以在很多情况下使用这种技术,在这种情况下,你确实希望屏幕的某个区域作为button而不是搞乱Touch的东西。
一个UIImageView
派生自一个UIView
派生自UIResponder
所以它已经准备好处理触摸事件。 您需要提供touchesBegan
, touchesMoved
和touchesEnded
方法,如果用户点击图像,则会调用它们。 如果你想要的只是一个点击事件,那么只需要使用一个自定义button并将图像设置为button图像就更容易了。 但是,如果你想要更好的控制水龙头,移动等,这是要走的路。
你也想看看更多的东西:
-
覆盖
canBecomeFirstResponder
并返回YES以指示视图可以成为触摸事件的焦点(默认为NO)。 -
将
userInteractionEnabled
属性设置为YES。UIViews
的默认值是YES,但对于UIImageViews
是NO,所以你必须明确地打开它。 -
如果你想回应多点触摸事件(即捏,缩放等),你将要设置
multipleTouchEnabled
为YES。
要将一个触摸事件添加到UIImageView,请在.m中使用以下内容
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)]; [myImageView setUserInteractionEnabled:YES]; [myImageView addGestureRecognizer:newTap]; -(void)myTapMethod{ // treat image tap }
希望有所帮助。
您也可以添加一个UIGestureRecognizer。 它不要求你在你的视图层次结构中添加一个额外的元素,但是仍然可以为你提供用相当简单的界面处理触摸事件的所有很好的代码。
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)]; swipeRight.direction = UISwipeGestureRecognizerDirectionRight; [imgView_ addGestureRecognizer:swipeRight]; [swipeRight release]; UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)]; swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; [imgView_ addGestureRecognizer:swipeLeft]; [swipeLeft release];
在过去的几个小时里,我一直在不同的线程上试图为我的问题find一个解决scheme,无济于事。 我看到很多开发者都有这个问题,我想这里的人都知道这个。 我有一个UIScrollView
内的多个图像,试图获取他们的水龙头事件。
没有从UIImangeView
获取任何事件,但是我从类似的UILable
得到了一个事件,它的参数非常相似。 在IOS 5.1下。
我已经完成了以下工作:
- 为UIImageView和父视图设置setUserInteractionEnabled为YES。
- 为
UIImageView
设置setMultipleTouchEnabled为YES。 - 尝试了
UIImageView
子类,没有任何帮助。
在下面附加一些代码,在这个代码中,我初始化了UIImageView
和UILabel
,标签在击发事件方面工作正常。 我试着保留不相关的代码。 谢谢你们,Ilan
UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)]; single_view.image=img; single_view.layer.zPosition=4; UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)]; [single_view addGestureRecognizer:singleTap]; [single_view setMultipleTouchEnabled:YES]; [single_view setUserInteractionEnabled:YES]; [self.myScrollView addSubview:single_view]; self.myScrollView.userInteractionEnabled=YES; UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; testLabel.backgroundColor=[UIColor redColor]; [self.myScrollView addSubview:testLabel]; [testLabel addGestureRecognizer:singleTap]; [testLabel setMultipleTouchEnabled:YES]; [testLabel setUserInteractionEnabled:YES]; testLabel.layer.zPosition=4;
处理事件的方法是:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture { UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil]; NSLog(@"Touch event on view: %@",[tappedView class]); }
如上所述,接收到标签。
而不是做一个可触摸的UIImageView,然后将其放置在导航栏上,你应该创build一个UIBarButtonItem,你从UIImageView。
首先进行图像视图:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
然后让你的图像视图中的barbutton项目:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
然后将条形button项添加到导航栏中:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
请记住,此代码进入导航控制器视图控制器数组内的视图控制器。 所以基本上,这个“可触摸的图像看条形button项目”只有在这个视图控制器被显示时才会出现在导航条中。 当你推动另一个视图控制器,这个导航栏button项将消失〜
你可能想要做的是覆盖包含你的UIImageView
子视图的UIView
(或子类)的touchesBegan:withEvent:
方法。
在这个方法中,testing是否有任何的UITouch
触摸落在UIImageView
实例的边界内(假设它被称为imageView
)。
也就是说, CGPoint
元素[touch locationInView]
与CGRect
元素[imageView bounds]
CGRect
[imageView bounds]
相交? 看看CGRectContainsPoint
函数来运行这个testing。
首先你应该放置一个UIButton,然后你可以为这个button添加背景图片,或者你需要在button上放置一个UIImageView。
将该view.add图像的手势添加到该视图中,然后它将检测图像上的手势。可以尝试使用触摸事件的委托方法,那么在这种情况下,它也可能被检测到。 谢谢