[英]How can I detect the touch event of an UIImageView?
我在导航栏上放置了一个图像(UIImageView)。 现在我想检测触摸事件并想要处理该事件。 我怎样才能做到这一点?
实际上,不要那样做。
而是在 UIImageView 上添加一个具有自定义样式的按钮(除非您指定图像,否则没有按钮图形)。 然后附加任何你想调用的方法。
您可以在许多情况下使用该技术,在这种情况下,您确实希望屏幕的某些区域充当按钮而不是弄乱 Touch 的东西。
UIImageView
派生自UIView
派生自UIResponder
因此它已准备好处理触摸事件。 您需要提供touchesBegan
、 touchesMoved
和touchesEnded
方法,如果用户点击图像,它们将被调用。 如果您想要的只是点击事件,那么使用自定义按钮并将图像设置为按钮图像会更容易。 但是如果你想对点击、移动等进行更精细的控制,这就是要走的路。
您还需要查看更多内容:
覆盖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];
在过去的几个小时里,我一直在不同的线程上试图为我的问题找到解决方案,但无济于事。 我看到许多开发人员都有这个问题,我认为这里的人都知道这一点。 我在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]);
}
如上所述,接收到标签抽头。
与其制作可触摸的 UIImageView,然后将其放置在导航栏上,不如创建一个 UIBarButtonItem,它由 UIImageView 制作。
首先制作图像视图:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
然后从图像视图中制作 barbutton 项目:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
然后将栏按钮项添加到导航栏:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
请记住,此代码进入导航控制器视图控制器数组内的视图控制器。 所以基本上,这个“可触摸的图像栏按钮项”只会在显示此视图控制器时出现在导航栏中。 当您按下另一个视图控制器时,此导航栏按钮项将消失。
您可能想要覆盖包含UIImageView
子视图的UIView
(或子类)的touchesBegan:withEvent:
方法。
在这个方法中,测试是否有任何UITouch
触摸落在UIImageView
实例的边界内(假设它被称为imageView
)。
也就是说, CGPoint
元素[touch locationInView]
与CGRect
元素[imageView bounds]
CGRect
[imageView bounds]
相交? 查看函数CGRectContainsPoint
以运行此测试。
首先,您应该放置一个 UIButton,然后您可以为此按钮添加背景图像,或者您需要在按钮上放置一个 UIImageView。
或者:
您可以将点击手势添加到 UIImageView,以便在点击 UIImageView 时获得点击动作。
对于那些正在寻找针对此答案的 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
}
在该视图上添加手势。 将图像添加到该视图中,然后它也会检测图像上的手势。 您可以尝试使用触摸事件的委托方法。 那么在这种情况下,它也可能正在检测。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.