Search code examples
iosobjective-cuibuttonnstimeruilongpressgesturerecogni

How to change color of a UIButton while pressed ONLY and cancel color change if released before x amount of seconds?


I'm trying to make a button change color while being pressed for 3 seconds. Once timer reaches 3rd second the color change is permanent but if user releases button before time is up the button goes back to its original color. What I have so far is this: in viewDidLoad

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                           initWithTarget:self
                                           action:@selector(fireSomeMethod)];
longPress.minimumPressDuration = 3.0;
[self.view addGestureRecognizer:longPress]; 

in fireSomeMethod I have

- (void)someMethod {
        [UIView transitionWithView:self.button
                  duration:2.0
                   options:UIViewAnimationOptionCurveEaseIn
                animations:^{
                    self.button.backgroundColor = [UIColor redColor];
                }
                completion:^(BOOL finished) {
                    NSLog(@"animation finished");
                }];
}

This requires me to hold the button down for 3 seconds for the animation to fire and animation itself takes 2 seconds to complete. The desired behavior is that animation starts when longPress starts and I release button before 3 seconds everything goes back to the way it was. Thanks for your help in advance


Solution

  • Make use of button event no need to use UILongPressGestureRecognizer

    Make 2 action for your button, one is for Touch Down and other is for Touch Up Inside

    like this

    // For `Touch Up Inside`
    - (IBAction)btnReleased:(id)sender {
        [timer invalidate];
        NSLog(@"time - %d",timeStarted);
    }
    // For `Touch Down`
    - (IBAction)btnTouchedDown:(id)sender {
        timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                         target:self
                                       selector:@selector(_timerFired:)
                                       userInfo:nil
                                        repeats:YES];
        timeStarted = 0;
    }
    
    - (void)_timerFired:(NSTimer *)timer {\
        timeStarted++;
    }
    

    Create 2 variable timer of type NSTimer and timeStarted of type int. Fire the timer on Touch Down and invalidate it on Touch Up Inside, and in Touch Up Inside action method get the total time till your button is hold.As shown in the above code