George Friday
George Friday

Reputation: 585

Make hidden UIImage appear with long tap

In my project I would like to make a hidden image view appear when it is tapped for more than 3 seconds. I know I need to use NSTimer, but I have never created a UIImageView touch event. How can I combine the TapGestureRecognizer with NSTimer to achieve what I want to do? I am completely new to touch events in iOS, and I am just beginning to explore this. So, any help would be appreciated. Thank you!

UPDATE: I implemented the UILongPressGestureRecognizer as below, but now, the hidden image appears even if I press somewhere outside of the image. How can I make it appear only if pressing the hidden image itself?

 - (void)viewDidLoad
    {
            [super viewDidLoad];

        UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPress:)];
        longPress.numberOfTouchesRequired = 1;
longPress.minimumPressDuration = 3;
        [self.view addGestureRecognizer:longPress];
    }


-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture
{
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        BrokenGlass.hidden = NO;


    }
}

Upvotes: 1

Views: 405

Answers (2)

alexandresoli
alexandresoli

Reputation: 928

  • The image is appearing because you are using the gesture recognizer in the entire view.
        [**self.view** addGestureRecognizer:longPress];
  • The gesture will not trigger on a hidden element.

Here is my solution:

@interface ViewController () <UIGestureRecognizerDelegate>

@property (nonatomic, strong) UIImageView *imageView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // create the imageView
    _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];

    // enable the user interaction in the imageView (otherwise it will not receive events)
    _imageView.userInteractionEnabled = YES;

    // add as a subview of the main view
    [self.view addSubview:_imageView];

    // create the gesture recognizer
    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressHandler:)];
    longPressGesture.delegate = self;
    longPressGesture.minimumPressDuration = 3;

    // add the gesture to the imageView
    [_imageView addGestureRecognizer:longPressGesture];

}

#pragma mark - UIGestureRecognizerDelegate
- (void)longPressHandler:(UILongPressGestureRecognizer *)gestureRecognizer {

    // show the image
    _imageView.image = [UIImage imageNamed:@"cat.jpeg"];

}

Upvotes: 0

Kevin
Kevin

Reputation: 56059

You don't want a UITapGestureRecognizer and a timer, you want a UILongPressGestureRecognizer.

Upvotes: 2

Related Questions