我还没有找到一种非常简单的方法。我所看到的方式需要所有这些计时器和东西。有没有简单的方法可以容纳UIButton并让它一遍又一遍地重复动作直到它被释放?
答案 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
事件从startAction
和Touch 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];
}