UIButton触摸并保持

时间:2010-07-19 20:29:01

标签: cocoa-touch uibutton

我还没有找到一种非常简单的方法。我所看到的方式需要所有这些计时器和东西。有没有简单的方法可以容纳UIButton并让它一遍又一遍地重复动作直到它被释放?

5 个答案:

答案 0 :(得分:17)

您可以执行以下操作:创建一个NSTimer,它将在应用程序启动时或在viewDidLoad中启动,并且还会生成一个布尔值。

例如:

//Declare the timer, boolean and the needed IBActions in interface.
@interface className {
NSTimer * timer;
bool g;
}
-(IBAction)theTouchDown(id)sender;
-(IBAction)theTouchUpInside(id)sender;
-(IBAction)theTouchUpOutside(id)sender;

//Give the timer properties.
@property (nonatomic, retain) NSTimer * timer;

现在在您的实现文件(.m)中:

//Synthesize the timer
@synthesize timer;
//When your view loads initialize the timer and boolean.
-(void)viewDidLoad {
    g = false;
    timer = [NSTimer scheduledTimerWithInterval: 1.0 target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES];
}

现在为“Touch Down”做一个IBAction设置布尔值让我们说真的。然后为“Touch Up Inside”和“Touch Up Outside”创建另一个IBAction按钮,将布尔值指定为false。

例如:

-(IBAction)theTouchDown {
    g = true;
}

-(IBAction)theTouchUpInside {
    g = false;
}

-(IBAction)theTouchUpOutside {
    g = false;
}

然后在该NSTimer方法中,输入以下内容:(假设g是您声明的布尔值)

-(void) targetmethod:(id)sender {
    if (g == true) {
        //This is for "Touch and Hold"
    }
    else {
        //This is for the person is off the button.
    }
}

我希望这能简化一切......我知道它仍然使用计时器,但没有其他办法。

答案 1 :(得分:10)

不幸的是,您仍然需要为自己编写此功能。最简单的方法(你仍然需要一个计时器):

执行您想要重复的操作的函数:

-(void) actionToRepeat:(NSTimer *)timer
{
    NSLog(@"Action triggered");
}
在您的.h文件中

声明并设置定时器的属性:

@interface ClassFoo
{
    NSTimer* holdTimer;
}

然后在.m中进行两次IBAction:

-(IBAction) startAction: (id)sender
{
    holdTimer = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(actionToRepeat:) userInfo:nil repeats:YES];
    [holdTimer retain];
}

-(IBAction) stopAction: (id)sender
{
    [holdTimer invalidate];
    [holdTimer release];
    holdTimer = nil;
}

然后,只需将按钮中的Touch Down事件从startActionTouch Up Inside连接到'停止操作'即可。它不是一个单行,但它允许您自定义动作重复的速率,并允许您从另一个插座/动作触发它。

如果您要经常使用此功能,您可以考虑继承UIButton并添加此功能 - 那么第一次实施它只会(稍微)痛苦。

答案 2 :(得分:9)

另一种使用this NBTouchAndHoldButton的方式。这正是您想要的,并且非常容易实现它:

TouchAndHoldButton * pageDownButton = [TouchAndHoldButton buttonWithType:UIButtonTypeCustom];
[pageDownButton addTarget:self action:@selector(pageDownAction:) forTouchAndHoldControlEventWithTimeInterval:0.2];
祝你好运!

答案 3 :(得分:1)

我无法回复第一个,但是这一行:

timer = [NSTimer scheduledTimerWithInterval: 1.0 target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES];

至少iOS 4.1和更新版本需要:

timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES];

答案 4 :(得分:0)

我知道这是一个老问题,但是作为一种简单的方法,比如考虑使用“[NSObject performSelector:withObject:afterDelay:]”来重复调用任何特定时间间隔内的方法。

在这种情况下:

NSTimeInterval someTimeInterval = 1;

- (IBAction)action:(id)sender {
    UIButton * const button = sender;
    if (button.state != UIControlStateHighlighted) {
        return;
    }
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:_cmd object:sender];
    [self performSelector:_cmd withObject:sender afterDelay:someTimeInterval];
}