如何在obj-c中连续按下按钮时重复执行操作

时间:2011-11-23 20:41:18

标签: objective-c ios cocoa-touch

我有四个简单的方法,四个按钮和一个对象。

- (IBAction)left:(id)sender{
    object.center = CGPointMake(object.center.x - 5, object.center.y);
}

- (IBAction)right:(id)sender{
    object.center = CGPointMake(object.center.x + 5, object.center.y);
}
- (IBAction)down:(id)sender{
    object.center = CGPointMake(object.center.x, object.center.y + 5);
}
- (IBAction)up:(id)sender{
    object.center = CGPointMake(object.center.x, object.center.y - 5);
}

当我按下按钮时,该方法执行一次。连续按下按钮时,它是相同的。 我必须做什么,当我连续按下按钮时,我的物体继续向左移动?

3 个答案:

答案 0 :(得分:1)

正如@Maudicus所说,你可能需要对NSTimer做一些事情才能获得连续的按键触发功能。我要使用的例子是在屏幕上移动一个对象(因为你想要这样做)。我已经使用了渐变移动,因为我不知道你是否正在编写一个基于网格的游戏,因此需要5个像素的移动。只需删除所有stepSize代码并将其设置为5,如果这就是你所做的。

  1. 写一个定时器回调函数,检查是否设置了BOOL,如果是,则保持触发:

    - (void)moveObjectLeft:(NSTimer *)timer
    {
        // check the total move offset and/or the X location of the object here
        // if the object can't be moved further left then invalidate the timer
        // you don't need to check whether the button is still being pressed
        //[timer invalidate];
        //return;
    
        // the object moves gradually faster as you hold the button down for longer
        NSNumber *moveOffset = (NSNumber *)[timer userInfo];
        NSUInteger stepSize = 1;
        if(moveOffset >= 40)
            stepSize = 10;
        else if(moveOffset >= 15)
            stepSize = 5;
        else if(moveOffset >= 5)
            stepSize = 2;
    
        // move the object
        object.center = CGPointMake(object.center.x - stepSize, object.center.y);
    
        // store the new total move offset for this press
        moveOffset += stepSize;
        [timer setUserInfo:moveOffset];
    }
    
  2. 在当前班级.h中创建一个计时器属性:

    @property (nonatomic, retain) NSTimer *moveTimer;
    
  3. .m

    中合成它
    @synthesize moveTimer;
    
  4. 按下按钮时创建计时器对象。在touchesBegan:withEvent:中执行此操作并检查它是Touch Down事件,或将Interface Builder中的Touch Down事件连接到IBAction方法。

    NSNumber *moveOffset = [NSNumber numberWithUnsignedInt:0];
    self.moveTimer =
        [NSTimer
         scheduledTimerWithTimeInterval:0.2
         target:self
         selector:@selector(moveObject:)
         userInfo:moveOffset
         repeats:YES];
    
  5. 当按钮被释放时(再次使用上述方法之一,touchesEnded:withEvent:用于Touch Up Inside或甚至可能是Touch Up Outside,或其他IBAction ),外部使计时器无效:

    [self.moveTimer invalidate];
    self.moveTimer = nil;
    

答案 1 :(得分:0)

当按钮发出其mousedown事件时,开始移动。当按钮发出鼠标事件时,停止移动。

小心;如果可以同时按下多个按钮,这可能会很有趣。

答案 2 :(得分:0)

我认为您需要安排计时器并重复检查按钮状态的方法。

//假设计时器设置为测试按钮状态,每隔x秒触发controlLoop

-(void)controlsLoop
{
    if (leftButton.state == UIControlStateSelected || leftButton.state == UIControlStateHighlighted)  {

    }
}

我之前从未这样做过,所以玩得开心玩得开心。 我通常在Cocos2d中实现你想要的控制,

实施这些方法可能更好

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

设置您想要移动对象的方向,并且还有一个触发实际移动的计时器。