How to add gesture recognizer to a UIImageview?
Solution 1
Your UIView
obviously intercept the touches before they can reach the UIImageView
.
You can either put your UIImageView
in front of your UIView
, or disable user interaction on the UIView
so it does not intercept the touches.
If you need finer grain over catching your touch events, you may either:
- put your
UIView
on top of theUIImageView
if it has to for design purposes (if it masks theUIImageView
a bit for example) but make it not catch events (userInteractionEnabled = NO
), and use a differentUIView
below theUIImageView
to actually catch the events outside theUIImageView
- keep your
UIView
on top of theUIImageView
and keep it catching events (userInteractionEnabled = YES
), but filter the events that pass thru it, by subclassing yourUIView
and overriding either thepointInside:withEvent:
or thehitTest:withEvent:
method.
For more information you should really read the dedicated Apple Programming Guide related to Event Handling.
Solution 2
my code:
UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(hasLongPressed)];
[press setMinimumPressDuration:0.1f]; //1ms
press.delegate = (id)self;
[self.DGEMLogo addGestureRecognizer:press];
two properties are neccessary to do
1.) add the GestureRecognizer to your UIImageView (self.DGEMLogo) [self.DGEMLogo addGestureRecognizer:press];
2.) set your UIImage property Interaction enabled to TRUE
thats all.
pqteru
A writer and a developer in the field of software and Internet.
Updated on October 13, 2020Comments
-
pqteru over 3 years
In the project, there are an
UIView
myView and anUIImageView
myImage behinds the myView, views hierarchy:UIWindow
|-- UIImageView (myImage)
|-- UIView (myView) [whole screen]Then added a gesture recognizer to myImage in ViewController
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; tapGesture.numberOfTapsRequired = 1; [myImage addGestureRecognizer:tapGesture];
But gesture doesn't affect myImage, myImage has
setUserInteractionEnabled:YES
. It will only affect when myImage placed in front of myView, how can I solve this problem? -
pqteru over 11 yearsbut myImage has to stay behind myView, is there a way that I can make a detection while touch start and to determine which view is going to affect?
-
AliSoftware over 11 yearsYes. As I stated in my answer, turn user interaction off (
userInteractionEnabled = NO
) on the UIView. If theUIView
still needs to capture touch events anywhere except where theUIImageView
lies, you have multiple possibilities: (1) make yourUIView
on top of theUIImageView
but withuserInteractionEnabled = NO
and put anotherUIView
below theUIImageView
that capture every touch events that haven't been captured by theUIImageView
or (2) put theUIView
on top of theUIImageView
, subclass it & override thehitTest:withEvent:
orpointInside:withEvent:
UIView methods