UIButton Toque e segure

Eu não encontrei uma maneira muito fácil de fazer isso. As formas que vi exigem todos esses timeres e outras coisas. Existe alguma maneira fácil de segurar um UIButton e fazer com que ele repita a ação várias vezes até que seja liberado?

Você pode fazer o seguinte: Crie um NSTimer que iniciará quando o aplicativo iniciar ou em viewDidLoad e também criar um booleano.

Por exemplo:

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

Agora no seu arquivo de implementação (.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]; } 

Agora faça um IBAction para “Touch Down”, defina o valor booleano como “true”. Em seguida, faça outro botão IBAction para “Touch Up Inside” e “Touch Up Outside” para atribuir o valor booleano a false.

Por exemplo:

 -(IBAction)theTouchDown { g = true; } -(IBAction)theTouchUpInside { g = false; } -(IBAction)theTouchUpOutside { g = false; } 

Então, nesse método NSTimer, coloque o seguinte: (suponha que g seja o booleano que você declarou)

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

Espero que isso simplifique tudo … Eu sei que ainda usa um timer, mas não há outro caminho.

Infelizmente, ainda parece que você tem que codificar essa funcionalidade para você mesmo. maneira mais simples (você ainda precisa de um timer embora):

Uma function que executa a ação que você deseja repetir:

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

no seu arquivo .h declarar e definir uma propriedade para um timer:

 @interface ClassFoo { NSTimer* holdTimer; } 

Então, no .m, faça duas 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; } 

Em seguida, basta ligar para o evento Touch Down em IB do botão para startAction e o Touch Up Inside para o ‘Stop Action’. Não é um simples, mas permite que você personalize a taxa que a ação repete, além de permitir que você a dispare de outra saída / ação.

Você pode considerar a subclass de UIButton e adicionar essa funcionalidade se você estiver usando essa funcionalidade com frequência – então, é apenas (levemente) doloroso implementar a primeira vez.

Uma outra maneira de usar este NBTouchAndHoldButton . Isto é exatamente o que você quer, e muito fácil de implementar:

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

Boa sorte!

Não posso responder ao primeiro, mas esta linha:

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

pelo menos para o iOS 4.1 e mais recente precisa ser:

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

Eu sei que esta é uma questão antiga, mas como uma maneira fácil, gostaria de considerar o uso de “[NSObject performSelector: withObject: afterDelay:]” para invocar repetidamente methods em qualquer intervalo de tempo específico.

Nesse caso:

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