UITapGestureRecognizer not working in UIImageView

28,931

Solution 1

You should enable user interaction for UIImageView object:

[self.storyImageView_ setUserInteractionEnabled:YES];

EDIT:

Try to remove the

[showStoryTapRecognizer setDelegate:self];

I don't think UITapGestureRecognizer has its delegate methods as far as I know.

Solution 2

UIImageView has user interaction disabled by default, unlike most other UIView subclasses in UIKit.

Solution 3

I also noticed that in swift3, if you are adding a gesture recognizer which also looks for the target and the target is usually self, then you have to make the UIView to which you are adding the gesture recognizer to be a lazy var. Otherwise the gesture recognizer won't work. I think this is a bug in swift3. Ideally if you are accessing self in a variable before the class is fully initialized, it should throw an error. The code below won't detect gesture recognizer.

let messageImageView: CachedImageView = {
    let iv = CachedImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.layer.cornerRadius = 16
    iv.layer.masksToBounds = true
    iv.contentMode = .scaleAspectFill
    iv.isUserInteractionEnabled = true
    let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
    zoomTap.numberOfTapsRequired = 1
    iv.addGestureRecognizer(zoomTap)
    return iv
}()

To fix that, you have to use lazy var

lazy var messageImageView: CachedImageView = {
    let iv = CachedImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.layer.cornerRadius = 16
    iv.layer.masksToBounds = true
    iv.contentMode = .scaleAspectFill
    iv.isUserInteractionEnabled = true
    let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
    zoomTap.numberOfTapsRequired = 1
    iv.addGestureRecognizer(zoomTap)
    return iv
}()

Solution 4

Maybe ... action:@selector(showNewsStory) instead of action:@selector(showNewsStory:) . Please check it . Are there any other UITapGestureRecognizer in this controller ? Try this:

otherTapRecognizer.cancelsTouchesInView = NO;

Solution 5

objective-c ios 10

UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;

// swift 3.0

   let oneTouch = UITapGestureRecognizer(target: self, action: #selector(self.OneTouchHandeler(_:)))

imageView.addGestureRecognizer(oneTouch)

imageView.isUserInteractionEnabled = true
Share:
28,931
xonegirlz
Author by

xonegirlz

Updated on April 27, 2021

Comments

  • xonegirlz
    xonegirlz about 3 years

    I had the following code:

    UITapGestureRecognizer *showStoryTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showNewsStory:)];
    [showStoryTapRecognizer setDelegate:self];
    [self.storyImageView_ addGestureRecognizer:showStoryTapRecognizer];
    [showStoryTapRecognizer release];
    

    This however doesn't trigger the showNewsStory, why is this? I have enabled userInteraction in the image view.