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