Как вы знаете, вы должны использовать функции touchesBegan, Moved, Ended и Cancelled для iOS до 3.2.
Я думаю, что реализация только touchesMoved - это плохо, потому что если пользователь нажимает и вообще не двигается до отпускания, то touchesMoved никогда не будет вызываться.
Вместо этого я использовал NSTimer для получения события касания длинным нажатием.
Это может быть не оптимальным решением, но оно хорошо работает для моего приложения.
Вот фрагмент кода.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
isAvailable = NO;
timer = [NSTimer scheduledTimerWithTimeInterval:DURATION target:self selector:@selector(didPassTime:) userInfo:nil repeats:NO];
}
- (void)didPassTime:(id)sender{
isAvailable = YES;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
if(isAvailable == YES){
// still pressing after 0.5 seconds
}
else{
// still pressing before 0.5 seconds
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
if(isAvailable == YES){
// releasing a finger after 0.5 seconds
}
else {
// releasing a finger before 0.5 seconds
[timer invalidate];
timer = nil;
}
}