我在导航栏上放置了一个图像(UIImageView)。现在我想检测触摸事件并想要处理事件。你能让我知道我该怎么办?
感谢。
答案 0 :(得分:137)
实际上,不要这样做。
而是在UIImageView上添加一个自定义样式的按钮(除非你指定图像,没有按钮图形)。然后将你想要的任何方法附加到那个。
你可以在很多情况下使用这种技术,你真的希望屏幕的某些区域充当按钮,而不是搞乱Touch的东西。
答案 1 :(得分:115)
UIImageView
派生自UIView
,UIResponder
派生自touchesBegan
,因此可以处理触摸事件。您需要提供touchesMoved
,touchesEnded
和canBecomeFirstResponder
方法,如果用户点按图片,它们就会被调用。如果你想要的只是一个点击事件,那么只需使用自定义按钮并将图像设置为按钮图像就更容易了。但是如果你想要对水龙头,移动等进行更细粒度的控制,那么这就是你要做的。
您还需要了解更多内容:
覆盖userInteractionEnabled
并返回YES表示视图可以成为触摸事件的焦点(默认为NO)。
将UIViews
属性设置为YES。 UIImageViews
的默认设置为YES,但multipleTouchEnabled
为NO,因此您必须明确启用它。
如果您想要回复多点触控事件(例如捏合,缩放等),您需要将{{1}}设为是。
答案 2 :(得分:49)
要向UIImageView添加触摸事件,请在.m
中使用以下内容UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
希望有所帮助。
答案 3 :(得分:23)
您还可以添加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];
答案 4 :(得分:13)
在过去的几个小时里,我一直在寻找解决方案来解决我的问题,但无济于事。
我看到很多开发者都有这个问题,我想这里的人都知道这个问题。
我在UIScrollView
中有多个图片,试图在它们上面点击活动。
没有从UIImangeView
获取任何事件,但我确实从类似的UILable
获得了一个事件,其中我设置的参数非常相似。根据IOS 5.1。
我已经完成了以下工作:
UIImageView
设置setMultipleTouchEnabled为YES。UIImageView
,但没有任何帮助。在下面附加一些代码,在此代码中我初始化UIImageView
和UILabel
,标签在触发事件方面工作正常。我试着保留不相关的代码。
多谢你们,
伊兰
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]);
}
如上所述,收到标签点击。
答案 5 :(得分:6)
您应该创建一个UIBarButtonItem,而不是制作可触摸的UIImageView,然后将其放置在导航栏上。您可以使用UIImageView创建一个UIBarButtonItem。
首先制作图片视图:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
然后将barbutton项目从图像视图中删除:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
然后将栏按钮项添加到导航栏:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
请记住,此代码进入视图控制器,该控制器位于导航控制器视图控制器阵列中。所以基本上,当这个视图控制器显示时,这个“可触摸图像的条形按钮项”只会出现在导航栏中。当您按下另一个视图控制器时,此导航栏按钮项将消失〜
答案 6 :(得分:3)
您可能想要做的是覆盖包含touchesBegan:withEvent:
子视图的UIView
(或子类)的UIImageView
方法。
在此方法中,测试任何UITouch
触摸是否属于UIImageView
实例的边界(假设它被称为imageView
)。
也就是说,CGPoint
元素[touch locationInView]
与CGRect
元素[imageView bounds]
相交?查看函数CGRectContainsPoint
以运行此测试。
答案 7 :(得分:1)
首先你应该放置一个UIButton,然后你可以为这个按钮添加背景图像,或者你需要在按钮上放置一个UIImageView。
或
您可以将点击手势添加到UIImageView,以便在点击UIImageView时获取点击操作。
答案 8 :(得分:0)
对于那些寻找Swift 4解决方案的人来说这个答案。您可以使用以下内容在UIImageView上检测触摸事件。
git remote add -f somename someremoterepo
git subtree add --prefix ui somename develop --squash
然后,您需要按如下方式定义选择器:
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
答案 9 :(得分:-2)
将该view.add图像上的手势添加到该视图中,然后它也将检测图像上的手势。您是否可以尝试使用触摸事件的委托方法,那么在这种情况下它也可能正在检测。 感谢