Question

I am trying to figure out how I can set a button to not be highlighted when touchesmoved leaves the frame of the current selected button. See code below. The below code should allow any of the three buttons to be pressed individually and swipped. The problem I am having is that when the buttons a swipped eg using touchesmoved the buttons call the Actions but never set the buttons back to not be highlighted when the swipe leaves the button frame.

Thanks in advance,

Azza

- (void)touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
for(UITouch *t in touches) { 

CGPoint location = [t locationInView:t.view]; 

if((CGRectContainsPoint(Button1.frame, location))  && (!Button1.isHighlighted))
{ 
    if (!Button1.isHighlighted){ 
       [Button1 setHighlighted:YES];
       [self doAction1]; 
     }else{
       [Button1 setHighlight:NO];
     }
 }

if((CGRectContainsPoint(Button2.frame, location))  && (!Button2.isHighlighted))
{ 
    if (!Button2.isHighlighted){ 
       [Button2 setHighlighted:YES];
       [self doAction2]; 
     }else{
       [Button2 setHighlight:NO];
     }
 }

if((CGRectContainsPoint(Button3.frame, location))  && (!Button3.isHighlighted))
{ 
    if (!Button3.isHighlighted){ 
       [Button3 setHighlighted:YES];
       [self doAction3]; 
     }else{
       [Button3 setHighlight:NO];
     }
 }
 }

- (void)touchesBegan: (NSSet *)touches withEvent:(UIEvent *)event {
for(UITouch *t in touches) { 

CGPoint location = [t locationInView:t.view]; 

if(CGRectContainsPoint(Button1.frame, location))
{ 
    if (!Button1.isHighlighted){ 
       [Button1 setHighlighted:YES];
       [self doAction1]; 
     }
 }

if(CGRectContainsPoint(Button2.frame, location)) 
{ 
    if (!Button2.isHighlighted){ 
       [Button2 setHighlighted:YES];
       [self doAction2]; 
     }
 }

if(CGRectContainsPoint(Button3.frame, location))
{ 
    if (!Button3.isHighlighted){ 
       [Button3 setHighlighted:YES];
       [self doAction3]; 
     }
 }
 }


- (void)touchesEnded: (NSSet *)touches withEvent:(UIEvent *)event {

    for (UITouch *t in touches){
    CGPoint location = [t locationInView:self.view]; 

    if(CGRectContainsPoint(Button1.frame, location)) {    
        [Button1 setHighlighted:NO];

    } else if(CGRectContainsPoint(Button2.frame, location)) { 
           [Button2 setHighlighted:NO];

    } else if(CGRectContainsPoint(Button3.frame, location)) { 
       [Button3 setHighlighted:NO];
    }
   }
 }
Was it helpful?

Solution

OK, I know I've handled this same issue before. I also see a reference to it in my own comments in the code. I've attached a chunk of very old code that I wrote to handle simulated buttons (similar to what you are doing). Maybe looking through this will help:

typedef struct {
            BOOL enabled;
            BOOL isActivated;
            NSTimeInterval activatedStartTime;
            NSTimeInterval holdTime;
            CGRect frame;
            UIImageView *glowImage;
            BOOL processPending;
            SEL callWhenTouched;
            } SIM_BUTTON;



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
    int fingers = [touches count];
    UITouch *touch;
    CGPoint touchPoint;
    int i, j;

    for (i=0; i<fingers; i++)
        {
        touch = [[touches allObjects] objectAtIndex:i];
        touchPoint = [touch locationInView:self.view];


        for ( j=0; j<SIM_BUTTON_COUNT; j++)
            {
            if ( simButton[j].enabled && CGRectContainsPoint( simButton[j].frame, touchPoint) )
                {
                simButton[j].isActivated=YES;
                simButton[j].activatedStartTime = [NSDate timeIntervalSinceReferenceDate];
                simButton[j].processPending = YES;
                }
            }
        }
    }



- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
    int fingers = [touches count];
    UITouch *touch;
    CGPoint touchPoint;
    CGPoint previousTouchPoint;
    int i, j;

    for (i=0; i<fingers; i++)
        {
        touch = [[touches allObjects] objectAtIndex:i];
        touchPoint = [touch locationInView:self.view];
        previousTouchPoint = [touch previousLocationInView:self.view];

        for ( j=0; j<SIM_BUTTON_COUNT; j++)
            {
            if ( simButton[j].enabled && simButton[j].isActivated && CGRectContainsPoint( simButton[j].frame, touchPoint) && CGRectContainsPoint( simButton[j].frame, previousTouchPoint) )
                {
                simButton[j].isActivated=YES;
                }
            else
            if ( simButton[j].enabled && !simButton[j].isActivated && CGRectContainsPoint( simButton[j].frame, touchPoint) && CGRectContainsPoint( simButton[j].frame, previousTouchPoint) )
                {
                simButton[j].activatedStartTime = [NSDate timeIntervalSinceReferenceDate];
                simButton[j].isActivated=YES;
                }
            else
            if ( simButton[j].enabled && simButton[j].isActivated && !CGRectContainsPoint( simButton[j].frame, touchPoint) && CGRectContainsPoint( simButton[j].frame, previousTouchPoint) )
                {
                simButton[j].isActivated=NO;
                simButton[j].activatedStartTime = (NSTimeInterval)0.0;
                }
            else
            if ( simButton[j].enabled && !simButton[j].isActivated && CGRectContainsPoint( simButton[j].frame, touchPoint) && !CGRectContainsPoint( simButton[j].frame, previousTouchPoint) )
                {
                simButton[j].isActivated=YES;
                simButton[j].activatedStartTime = [NSDate timeIntervalSinceReferenceDate];
                simButton[j].processPending = YES;
                }

            //
            // If the user touched the SCAN button and then slid their finger off of the SCAN button
            //
            if ( scannerActive==YES && simButton[RIGHT_SCAN_BUTTON].isActivated==NO && CGRectContainsPoint( simButton[RIGHT_SCAN_BUTTON].frame, previousTouchPoint) )
                {
                phraseMode = EXTERNAL_SCAN_PHRASES;     // Default
                }
            }
        }
    }



- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
    int fingers = [touches count];
    UITouch *touch;
    CGPoint touchPoint;
    CGPoint previousTouchPoint;
    int i, j;

    for (i=0; i<fingers; i++)
        {
        touch = [[touches allObjects] objectAtIndex:i];
        touchPoint = [touch locationInView:self.view];
        previousTouchPoint = [touch previousLocationInView:self.view];

        for ( j=0; j<SIM_BUTTON_COUNT; j++)
            {
            if ( simButton[j].enabled && simButton[j].isActivated && (CGRectContainsPoint( simButton[j].frame, touchPoint) || CGRectContainsPoint( simButton[j].frame, previousTouchPoint)) )
                {
                simButton[j].isActivated=NO;
                simButton[j].activatedStartTime = (NSTimeInterval)0.0;
                }
            }
        }
    }



- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    {
    [self touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event];
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top