我的GestureRecognizer
UITableViewCell
出现了问题,我左右手势轻扫,按住2秒钟,在桌面视图中捏住手势,向右下方滑动,下一章,向左滑动前一章,捏用于重定向到另一个视图控制器,并按住2秒以显示弹出窗口(子视图).all在一个名为table的表视图中实现。我的问题是每件事都运行正常,但经过一段时间在桌面视图中使用手势后,它会卡住swipeGesture
可能会捏也无法正常工作。但当我去另一页并回来时,它开始正常工作。它也在一段时间后停滞不前。如何解决这个问题?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
readCell *cell = (readCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)];
swipeGesture.direction = UISwipeGestureRecognizerDirectionRight; // or whatever
[table addGestureRecognizer:swipeGesture];
[swipeGesture release];
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1.0; //seconds
lpgr.delegate = self;
[table addGestureRecognizer:lpgr];
[lpgr release];
UISwipeGestureRecognizer *swipeGestureleft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGestureleft:)];
swipeGestureleft.direction = UISwipeGestureRecognizerDirectionLeft; // or whatever
[table addGestureRecognizer:swipeGestureleft];
[swipeGestureleft release];
UIPinchGestureRecognizer *longPressRecognizer =
[[UIPinchGestureRecognizer alloc]
initWithTarget:self
action:@selector(longPressDetected:)];
[self.view addGestureRecognizer:longPressRecognizer];
[longPressRecognizer release];
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
CGPoint p = [gestureRecognizer locationInView:table];
NSIndexPath *indexPath = [table indexPathForRowAtPoint:p];
if (indexPath == nil)
NSLog(@"long press on table view but not on a row");
else
// localStringValueverseno= [tableView cellForRowAtIndexPath:indexPath];
localStringValueverseno = [(UILabel *)[[table cellForRowAtIndexPath:indexPath]
viewWithTag:1] text];
localStringValue = [table cellForRowAtIndexPath:indexPath].textLabel.text;
_lblmainnotegns.text = localStringValueverseno;
// localStringValueverseno= [tableView cellForRowAtIndexPath:indexPath].cell.table.chapterAndVerse.text;
delegate.selectedIndex=[NSString stringWithFormat:@"%d",indexPath.row+1];
[userInfo setObject:[delegate.allSelectedVerseEnglish objectAtIndex:indexPath.row] forKey:@"text"];
[userInfo setObject:delegate.selectedBook forKey:@"book"];
[userInfo setObject:delegate.selectedChapter forKey:@"chapter"];
[userInfo setObject:[NSString stringWithFormat:@"%d",indexPath.row + 1] forKey:@"verse"];
UIView *noteView = (UIView *)[self.view viewWithTag:101];
//ViewWithTag Number should be same as used while allocating
[noteView removeFromSuperview];
//For removing View
UIView *acntView = (UIView *)[self.view viewWithTag:100];
//ViewWithTag Number should be same as used while allocating
[acntView removeFromSuperview];
// now you can use cell.textLabel.text
UIView *noteViewsync = (UIView *)[self.view viewWithTag:105];
//ViewWithTag Number should be same as used while allocating
[noteViewsync removeFromSuperview];
if ([notes objectForKey:[NSString stringWithFormat:@"%@ %@:%@",delegate.selectedBook,delegate.selectedChapter,delegate.selectedIndex]] == nil) {
[notetickimage setHidden:YES];
[self.view addSubview:MainPopupView];
}
if (gestureRecognizer.state==UIGestureRecognizerStateBegan ) {
self.table.scrollEnabled = NO;
[table removeGestureRecognizer:gestureRecognizer];
}
else if(gestureRecognizer.state==UIGestureRecognizerStateEnded) {
self.table.scrollEnabled = YES;
[table removeGestureRecognizer:gestureRecognizer];
}
NSLog(@"long press on table view at row %d", indexPath.row);
}
-(void) handleSwipeGesture:(UISwipeGestureRecognizer*)recognizer {
if(![delegate.selectedChapter isEqualToString:[NSString stringWithFormat:@"%d",[DbHandler mNumberOfChaptersInBook:delegate.selectedBook]]]) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationDelay:0.0];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDidStopSelector:@selector(animCompleteHandler:finished:context:)];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
[UIView commitAnimations];
// if the currentChapter is the last then do nothing
delegate.selectedChapter = [NSString stringWithFormat:@"%d",[delegate.selectedChapter intValue] + 1];
[delegate reloadVerses];
[self resetReadViewToVerse:1];
[table removeGestureRecognizer:recognizer];
}
if (recognizer.state==UIGestureRecognizerStateBegan ) {
self.table.scrollEnabled = NO;
[table removeGestureRecognizer:recognizer];
}
else if(recognizer.state==UIGestureRecognizerStateEnded) {
self.table.scrollEnabled = YES;
[table removeGestureRecognizer:recognizer];
}
return;
}
-(void) handleSwipeGestureleft:(UISwipeGestureRecognizer*)recognizer {
if(![delegate.selectedChapter isEqualToString:@"1"])
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationDelay:0.0];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDidStopSelector:@selector(animCompleteHandler:finished:context:)];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
[UIView commitAnimations];
delegate.selectedChapter = [NSString stringWithFormat:@"%d",[delegate.selectedChapter intValue] - 1];
[delegate reloadVerses];
[self resetReadViewToVerse:1];
[table removeGestureRecognizer:recognizer];
}
if (recognizer.state==UIGestureRecognizerStateBegan ) {
self.table.scrollEnabled = NO;
[table removeGestureRecognizer:recognizer];
}
else if(recognizer.state==UIGestureRecognizerStateEnded) {
self.table.scrollEnabled = YES;
[table removeGestureRecognizer:recognizer];
}
return;
}
-(void) longPressDetected:(UIPinchGestureRecognizer*)recognizer {
self.table.scrollEnabled = NO;
SearchViewController *aSecondViewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
aSecondViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:aSecondViewController animated:YES];
/*[self.navigationController pushViewController:aSecondViewController animated:YES];*/
[aSecondViewController release];
[UIView commitAnimations];
[table removeGestureRecognizer:recognizer];
UIView *noteView = (UIView *)[self.view viewWithTag:101];
//ViewWithTag Number should be same as used while allocating
[noteView removeFromSuperview];
UIView *setngView = (UIView *)[self.view viewWithTag:102];
//ViewWithTag Number should be same as used while allocating
[setngView removeFromSuperview];
UIView *acntView = (UIView *)[self.view viewWithTag:100];
//ViewWithTag Number should be same as used while allocating
[acntView removeFromSuperview];
UIView *popView = (UIView *)[self.view viewWithTag:106];
//ViewWithTag Number should be same as used while allocating
[popView removeFromSuperview];
}
当我们向左或向右滑动时,动作也很慢。 请帮帮我。
答案 0 :(得分:1)
每次调用例程tableView:cellForRowAtIndexPath:时都会添加一个识别器,并在处理完一个手势后删除一个识别器。因此,在删除所有识别器(其数量等于单元数量)之后,将无法识别手势。
也许你不应该在处理例程中删除识别器?
答案 1 :(得分:1)
您的手势识别器适用于整个表格,但每次创建单元格时都会添加它们!
不是每次创建单元格时都将手势识别器添加到整个表格,而是尝试将它们添加到其他位置。 或者,如果您的意思是仅在单元格中使用手势,请尝试使用:
[cell addGestureRecognizer:recognizer];