0

我试图弄清楚当 touchesmoved 离开当前选定按钮的框架时如何设置按钮不被突出显示。请参阅下面的代码。下面的代码应该允许单独按下和滑动三个按钮中的任何一个。我遇到的问题是,当按钮滑动时,例如使用 touchesmoved,按钮调用动作,但当滑动离开按钮框架时,从不将按钮设置回不突出显示。

提前致谢,

阿扎

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

1 回答 1

0

好的,我知道我以前处理过同样的问题。我还在我自己的代码注释中看到了对它的引用。我附上了一大块我编写的用于处理模拟按钮的非常旧的代码(类似于您正在做的事情)。也许浏览一下会有所帮助:

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];
    }
于 2010-11-25T00:23:27.437 回答