UIB Кнопки Touch и удерживайте - PullRequest
14 голосов
/ 20 июля 2010

Я не нашел очень простой способ сделать это. Пути, которые я видел, требуют всех этих таймеров и прочего. Есть ли какой-нибудь простой способ, которым я могу удерживать кнопку UIB и заставлять ее повторять действие снова и снова, пока оно не будет отпущено?

Ответы [ 5 ]

17 голосов
/ 20 июля 2010

Вы можете сделать следующее: Создать 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», установите логическое значение «допустим». Затем сделайте еще одну кнопку IBAction для «Touch Up Inside» и «Touch Up Outside», назначив логическое значение 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.
    }
}

Надеюсь, это все упрощает ... Я знаю, что он все еще использует таймер, но другого пути нет.

10 голосов
/ 20 июля 2010

К сожалению, все равно похоже, что вы должны кодировать эту функцию для себя.самый простой способ (вам все еще нужен таймер):

Функция, которая выполняет действие, которое вы хотите повторить:

-(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 на «Стоп Действие».Это не один вкладыш, но он позволяет вам настраивать частоту повторения действия, а также запускать его из другого выхода / действия.

Вы можете рассмотреть возможность создания подкласса UIButton и добавления этой функции, есливы будете часто использовать эту функциональность - тогда реализовать ее в первый раз будет очень (слегка) больно.

9 голосов
/ 13 сентября 2012

Другой способ использовать это NBTouchAndHoldButton .Это именно то, что вы хотите, и очень легко реализовать это:

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

Удачи!

1 голос
/ 12 сентября 2010

Я не могу ответить на первый, но эта строка:

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];
0 голосов
/ 30 июля 2013

Я знаю, что это старый вопрос, но как простой способ, например, рассмотреть возможность использования «[NSObject executeSelector: 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...