一定时间后取消 UILongPressGestureRecognizer
Cancel a UILongPressGestureRecognizer after a certain time
我在 UICollectionView
中使用了 UILongPressGestureRecognizer
。现在,当我在一定时间(例如 1 秒)后将手指放在 CollectionView 项目上时,我希望我的 UILongPressGestureRecognizer
结束并执行特定代码:
if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {}
这是我的代码:
- (void)viewDidLoad {
[super viewDidLoad];
Public = [[PublicMethods alloc]init];
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.collect];
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 3; //seconds
lpgr.delaysTouchesBegan = YES;
lpgr.delegate = self;
[self.collect addGestureRecognizer:lpgr];
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
return;
}
CGPoint p = [gestureRecognizer locationInView:self.collect];
NSIndexPath *indexPath = [self.collect indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
//CollectionViewCell* cell = (CollectionViewCell*)[self.collect cellForItemAtIndexPath:indexPath];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"bala" message:@"jalaaaa" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
[alert show];
}
}
您可以在 UILongPressGestureRecognizer
开始时实例化一个计时器,然后在计时器完成后取消手势并执行 "end gesture" 代码,例如(使用 1 秒的时间限制):
- (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
// Create a timer that calls cancel: 2.5 second after the
// gesture begins (i.e. 3 seconds after the button press if
// if lpgr.minimumPressDuration = .5;. Pass the gesture
// recognizer along within the user info dictionary parameter.
timer = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(cancel:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:gestureRecognizer, @"gestureRecognizer", nil] repeats:NO];
} else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
// Assuming you still want to execute the end code
// if the user lifts their finger before the 3 seconds
// is complete, use the same method called in the timer.
[self cancel:nil];
}
}
- (void)cancel:(NSTimer*)timerObject {
NSLog(@"%@",[timer.userInfo objectForKey:@"gestureRecognizer"]);
// Get the gesture recognizer from the info dictionary
UIGestureRecognizer *gestureRecognizer = [timer.userInfo objectForKey:@"gestureRecognizer"];
CGPoint p = [gestureRecognizer locationInView:self.collect];
NSIndexPath *indexPath = [self.collect indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
//CollectionViewCell* cell = (CollectionViewCell*)[self.collect cellForItemAtIndexPath:indexPath];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"bala" message:@"jalaaaa" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
[alert show];
}
// Disable it and re-enable it to cancel the gesture
gestureRecognizer.enabled = NO;
gestureRecognizer.enabled = YES;
// Invalidate the timer
[timer invalidate];
timer = nil;
}
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 0.4; // !!! Your certain time
[self.view addGestureRecognizer:longPress];
- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
{
// Catch first gesture changing and reset gesture
if (gesture.state == UIGestureRecognizerStateChanged) {
if (self.delegate) {
AudioServicesPlaySystemSound(1520);
[self.delegate call];
gesture.enabled = NO; // Reset gesture
gesture.enabled = YES;
}
}
我在 UICollectionView
中使用了 UILongPressGestureRecognizer
。现在,当我在一定时间(例如 1 秒)后将手指放在 CollectionView 项目上时,我希望我的 UILongPressGestureRecognizer
结束并执行特定代码:
if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {}
这是我的代码:
- (void)viewDidLoad {
[super viewDidLoad];
Public = [[PublicMethods alloc]init];
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.collect];
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 3; //seconds
lpgr.delaysTouchesBegan = YES;
lpgr.delegate = self;
[self.collect addGestureRecognizer:lpgr];
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
return;
}
CGPoint p = [gestureRecognizer locationInView:self.collect];
NSIndexPath *indexPath = [self.collect indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
//CollectionViewCell* cell = (CollectionViewCell*)[self.collect cellForItemAtIndexPath:indexPath];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"bala" message:@"jalaaaa" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
[alert show];
}
}
您可以在 UILongPressGestureRecognizer
开始时实例化一个计时器,然后在计时器完成后取消手势并执行 "end gesture" 代码,例如(使用 1 秒的时间限制):
- (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
// Create a timer that calls cancel: 2.5 second after the
// gesture begins (i.e. 3 seconds after the button press if
// if lpgr.minimumPressDuration = .5;. Pass the gesture
// recognizer along within the user info dictionary parameter.
timer = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(cancel:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:gestureRecognizer, @"gestureRecognizer", nil] repeats:NO];
} else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
// Assuming you still want to execute the end code
// if the user lifts their finger before the 3 seconds
// is complete, use the same method called in the timer.
[self cancel:nil];
}
}
- (void)cancel:(NSTimer*)timerObject {
NSLog(@"%@",[timer.userInfo objectForKey:@"gestureRecognizer"]);
// Get the gesture recognizer from the info dictionary
UIGestureRecognizer *gestureRecognizer = [timer.userInfo objectForKey:@"gestureRecognizer"];
CGPoint p = [gestureRecognizer locationInView:self.collect];
NSIndexPath *indexPath = [self.collect indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
//CollectionViewCell* cell = (CollectionViewCell*)[self.collect cellForItemAtIndexPath:indexPath];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"bala" message:@"jalaaaa" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
[alert show];
}
// Disable it and re-enable it to cancel the gesture
gestureRecognizer.enabled = NO;
gestureRecognizer.enabled = YES;
// Invalidate the timer
[timer invalidate];
timer = nil;
}
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 0.4; // !!! Your certain time
[self.view addGestureRecognizer:longPress];
- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
{
// Catch first gesture changing and reset gesture
if (gesture.state == UIGestureRecognizerStateChanged) {
if (self.delegate) {
AudioServicesPlaySystemSound(1520);
[self.delegate call];
gesture.enabled = NO; // Reset gesture
gesture.enabled = YES;
}
}