UIButton Touch и Hold
Я не нашел очень простой способ сделать это. Я видел, как все эти таймеры и прочее. Есть ли какой-либо простой способ я могу держать UIButton и заставлять его повторять действие снова и снова, пока оно не будет выпущено?
Ответы
Ответ 1
Вы можете сделать следующее: создать 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];
}
Теперь сделайте IBAction для "Touch Down", установите логическое значение, чтобы он сказал true. Затем сделайте еще одну кнопку IBAction для "Touch Up Inside" и "Touch Up Outside" присвойте 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.
}
}
Надеюсь, это упростит все... Я знаю, что он по-прежнему использует таймер, но нет другого способа.
Ответ 2
К сожалению, похоже, что вам нужно закодировать эту функцию для себя. Самый простой способ (вам все равно нужен таймер):
Функция, которая выполняет действие, которое вы хотите повторить:
-(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;
}
Затем просто соединитесь с событием Touch Down
в IB от кнопки до startAction
и Touch Up Inside
до "Stop Action". Это не один лайнер, но он позволяет настраивать скорость повторения действия, а также позволять вам запускать ее из другого выхода/действия.
Вы можете рассмотреть подклассификацию UIButton
и добавить эту функциональность, если вы собираетесь использовать эту функцию часто - тогда это только (слегка) больно реализовать в первый раз.
Ответ 3
Другой способ использовать этот NBTouchAndHoldButton. Это именно то, что вы хотите, и очень легко реализовать его:
TouchAndHoldButton * pageDownButton = [TouchAndHoldButton buttonWithType:UIButtonTypeCustom];
[pageDownButton addTarget:self action:@selector(pageDownAction:) forTouchAndHoldControlEventWithTimeInterval:0.2];
Удачи!
Ответ 4
Я не могу ответить на первый, но эта строка:
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];
Ответ 5
Я знаю, что это старый вопрос, но как простой способ, например, рассмотреть возможность использования "[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];
}