прикосновениядвижная рамка

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

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

Азза

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

person Aaron Stephenson    schedule 24.11.2010    source источник


Ответы (1)


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

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];
    }
person John Carter    schedule 25.11.2010
comment
Это заставило смахивание работать нормально. Но теперь, когда я смахиваю кнопку и отпускаю между ними, первая начальная кнопка остается выделенной. код ia dded приведен ниже if ((! CGRectContainsPoint (Button1.frame, location)) && if (CGRectContainsPoint (Button1.frame, previouslocation))) {[button1 setHighlighted: NO];} Я добавил по одному для каждой кнопки - person Aaron Stephenson; 25.11.2010
comment
Хорошо, я обновил свой ответ фрагментом старого кода, из которого я знаю, что имел дело с той же самой проблемой. Вероятно, написать его как объект вместо структуры было бы подходом, который я бы использовал сейчас - person John Carter; 25.11.2010
comment
Спасибо, я попробую, когда вернусь домой, и расскажу, как я пойду. - person Aaron Stephenson; 25.11.2010
comment
Работает как шарм Спасибо за вашу помощь - person Aaron Stephenson; 25.11.2010