我已将图像(UIImageView)放在导航栏上。现在,我想检测触摸事件并要处理该事件。您能告诉我该怎么做吗?
谢谢。
我已将图像(UIImageView)放在导航栏上。现在,我想检测触摸事件并要处理该事件。您能告诉我该怎么做吗?
谢谢。
Answers:
实际上,不要那样做。
而是在UIImageView上添加具有自定义样式的按钮(除非指定图像,否则没有按钮图形)。然后将要调用的任何方法附加到该方法。
您可以在很多情况下使用该技术,在这些情况下,您确实希望屏幕的某些区域充当按钮而不是弄乱Touch东西。
A UIImageView
是从a UIView
派生而来的,UIResponder
因此它已准备好处理触摸事件。您将要提供的touchesBegan
,touchesMoved
和touchesEnded
方法,如果用户点击图片就可以调用。如果您想要的只是一个轻击事件,则只使用将图像设置为按钮图像的自定义按钮会更容易。但是,如果您想对拍子,动作等进行更细粒度的控制,这就是方法。
您还需要查看一些其他信息:
覆盖canBecomeFirstResponder
并返回YES,以指示视图可以成为触摸事件的焦点(默认为NO)。
将userInteractionEnabled
属性设置为是。默认UIViews
值为YES,但默认UIImageViews
值为NO,因此您必须明确将其打开。
如果要响应多点触摸事件(例如,捏,缩放等),则需要设置 multipleTouchEnabled
为YES。
userInteractionEnabled
在父视图上将其设置为YES来解决。见stackoverflow.com/questions/5887305/...
要将触摸事件添加到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];
在过去的几个小时里,我一直在尝试不同的解决方案,但都无济于事。我看到许多开发人员都遇到了这个问题,并且我认为这里的人们对此有所了解。我里面有多张图片UIScrollView
,试图在它们上获得点击事件。
没有从接收任何事件UIImangeView
,但我确实从类似的事件UILable
我为其设置了非常相似的参数。在IOS 5.1下。
我已经做了以下工作:
UIImageView
。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]);
}
如前所述,标签标签被接收。
与其创建一个可触摸的UIImageView而不是将其放置在导航栏上,不如创建一个由UIImageView制成的UIBarButtonItem。
首先制作图像视图:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
然后将barbutton项目从图像视图中移出:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
然后将栏按钮项添加到导航栏中:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
请记住,这段代码进入了导航控制器viewcontroller数组内的视图控制器。因此,基本上,此“可触摸的图像显示按钮按钮项”将仅在显示此视图控制器时出现在导航栏中。当您按下另一个视图控制器时,该导航栏按钮项将消失〜
您可能想做的是覆盖包含子视图touchesBegan:withEvent:
的UIView
(或子类)方法UIImageView
。
在此方法中,测试是否有任何UITouch
接触落在UIImageView
实例的范围内(假设它称为imageView
)。
也就是说,它的CGPoint
元素[touch locationInView]
相交用的CGRect
元素[imageView bounds]
?查看功能CGRectContainsPoint
以运行此测试。
对于那些正在寻找此答案的Swift 4解决方案的人。您可以使用以下内容来检测UIImageView上的触摸事件。
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
然后,您需要定义选择器,如下所示:
@objc func imageViewTapped() {
// Image has been tapped
}