Search code examples
iosuitapgesturerecognizer

iOS Detect tap down and touch up of a UIView


I am stuck with a problem of determining how to detect a UIView being touched down and UIView being tapped. When it is touched down, I want the UIView to change its background color. When it is touched, I would like the UIView to perform certain tasks. I would like to know how I am able to fix this problem.

-(void)viewDidLoad
{        
    UITapGestureRecognizer *dismissGestureRecognition = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDismissDoubleTap:)];
    dismissGestureRecognition.numberOfTapsRequired = 1;
    [sectionDismissDoubleView addGestureRecognizer:dismissGestureRecognition];

    UITapGestureRecognizer *dismissGestureDownRecognition = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissGestureDownRecognition:)];
    dismissGestureRecognition.numberOfTouchesRequired = 1;
    [sectionDismissDoubleView addGestureRecognizer:dismissGestureDownRecognition];
}

- (void)handleDismissDoubleTap:(UIGestureRecognizer*)tap {
    SettingsDismissDoubleViewController *settingsDouble = [[SettingsDismissDoubleViewController alloc] initWithNibName:@"SettingsDismissDoubleViewController" bundle:nil];
    [self.navigationController pushViewController:settingsDouble animated:YES];
}

- (void)dismissGestureDownRecognition:(UIGestureRecognizer*)tap {
    NSLog(@"Down");
}

Solution

  • A Gesture Recognizer is probably overkill for what you want. You probably just want to use a combination of -touchesBegan:withEvent: and -touchesEnded:withEvent:.

    This is flawed, but it should give you and idea of what you want to do.

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        self.touchDown = YES;
        self.backgroundColor = [UIColor redColor];
    }
    
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // Triggered when touch is released
        if (self.isTouchDown) {
            self.backgroundColor = [UIColor whiteColor];
            self.touchDown = NO;
        }
    }
    
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // Triggered if touch leaves view
        if (self.isTouchDown) {
            self.backgroundColor = [UIColor whiteColor];
            self.touchDown = NO;
        }
    }
    

    This code should go in a custom subclass of UIView that you create. Then use this custom view type instead of UIView and you'll get touch handling.