UIButton触摸并保持

我还没有find一个很简单的方法来做到这一点。 我见过的方式需要所有这些计时器和东西。 有没有什么简单的方法,我可以持有一个UIButton,并导致它重复一遍又一遍的行动,直到它被释放?

您可以执行以下操作:创build一个NSTimer,在应用程序启动时或者在viewDidLoad中启动,并创build一个布尔值。

例如:

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

现在做一个IBAction为“触摸下”设置布尔值让说真。 然后为“Touch Up Inside”和“Touch Up Outside”创build另一个IBActionbutton,将boolean赋值为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. } } 

我希望这简化了一切…我知道它仍然使用计时器,但没有别的办法。

不幸的是,它仍然看起来像你必须为自己编写这个function。 最简单的方法(你仍然需要一个计时器):

一个执行你想要重复的动作的函数:

 -(void) actionToRepeat:(NSTimer *)timer { NSLog(@"Action triggered"); } 

在你的.h文件中声明并设置一个定时器的属性:

 @interface ClassFoo { NSTimer* holdTimer; } 

然后在.m中做两个IBActions:

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

然后,只需链接到IB中的Touch Down事件,即可从startActionbutton到Touch Up Inside Action Touch Up Inside中的“停止操作”。 这不是一个class轮,但它可以让你自定义的动作重复的速度,以及让你从另一个sockets/动作触发它。

你可能会考虑UIButton并添加这个function,如果你打算经常使用这个function – 那么第一次实现只是(稍微)痛苦的。

另一种使用此NBTouchAndHoldButton的方法 。 这正是你想要的,而且很容易实现它:

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

祝你好运!

我不能回复第一个,但是这一行:

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

至lessiOS 4.1和更新的需求是:

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

我知道这是一个古老的问题,但作为一个简单的方法,就像考虑使用“[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]; }