коснуться оставить рамку - PullRequest
0 голосов
/ 25 ноября 2010

Я пытаюсь выяснить, как настроить кнопку, чтобы она не выделялась, когда касание перемещено покидает кадр текущей выбранной кнопки. Смотрите код ниже. Приведенный ниже код должен позволять нажатие каждой из трех кнопок по отдельности и их замену. Проблема, с которой я сталкиваюсь, заключается в том, что когда кнопки, проведенные путем пролистывания, например, с помощью прикосновения, перемещаются, кнопки вызывают действия, но никогда не возвращают кнопки назад, чтобы они не выделялись, когда пролистывание оставляет рамку кнопки.

Заранее спасибо,

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];
    }
   }
 }

1 Ответ

0 голосов
/ 25 ноября 2010

ОК, я знаю, что уже занимался этой проблемой раньше.Я также вижу ссылку на это в моих собственных комментариях в коде.Я приложил кусок очень старого кода, который я написал для обработки имитируемых кнопок (аналогично тому, что вы делаете).Может быть, просмотр этого поможет:

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];
    }
...