Search code examples
iosobjective-cuitableviewuipangesturerecognizerdidselectrowatindexpath

Calling uipangesture from uitableviewcell class when tapped a cell


I am using ABMenuTableViewCell tableview controller in my application. I want to call didSelectRowAtIndexPath when i swipe a UITableViewCell.

Right now didSelectRowAtIndexPath only execute when I tap on a cell, I want to call it even when I swipe it. here is my didSelectRowAtIndexPath and cellforRowAtIndexPath methods code.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        UILabel *likes;
        UILabel *downloads;
        static NSString *CellIdentifier = @"Cell";
        ABMenuTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil)
        {
            cell = [[ABMenuTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
            arrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"acc_arrow_back.png"]];
            arrow.frame = CGRectMake(300, 50, 5, 12);
            arrow.image = [arrow.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
            [arrow setTintColor:[UIColor colorWithRed:(191/255.0) green:(2/255.0) blue:(6/255.0) alpha:1]];
            [cell.contentView addSubview:arrow];

UIImageView *likes_img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"social.png"]];
            likes_img.frame = CGRectMake(15, 80, 15, 15);
            likes_img.image = [likes_img.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
            [likes_img setTintColor:[UIColor colorWithRed:(191/255.0) green:(2/255.0) blue:(6/255.0) alpha:1]];
            [cell.contentView addSubview:likes_img];

            likes =[[UILabel alloc]initWithFrame:CGRectMake(33, 78, 80, 20)];
            likes.tag = 1001;    // set a tag for this View so you can get at it later
            likes.textColor=[UIColor darkGrayColor];
            likes.font=[UIFont fontWithName:@"Helvetica" size:10.0f];
            likes.text=[[rssOutputData objectAtIndex:indexPath.row]xmllikes];
            [cell.contentView addSubview:likes];
            cell.detailTextLabel.textColor = [UIColor darkGrayColor];

            UIImageView *downloads_img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"download.png"]];
            downloads_img.frame = CGRectMake(55, 79, 15, 15);
            downloads_img.image = [downloads_img.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
            [downloads_img setTintColor:[UIColor colorWithRed:(191/255.0) green:(2/255.0) blue:(6/255.0) alpha:1]];
            [cell.contentView addSubview:downloads_img];

            downloads =[[UILabel alloc]initWithFrame:CGRectMake(73, 78, 80, 20)];
            downloads.tag = 1002;    // set a tag for this View so you can get at it later
            downloads.textColor=[UIColor darkGrayColor];
            downloads.font=[UIFont fontWithName:@"Helvetica" size:10.0f];
            downloads.text=[[rssOutputData objectAtIndex:indexPath.row]xmldownloads];
            [cell.contentView addSubview:downloads];
            cell.detailTextLabel.textColor = [UIColor darkGrayColor];
        }
        else
        {
            // use viewWithTag to find lblNombre in the re-usable cell.contentView
            likes = (UILabel *)[cell.contentView viewWithTag:1001];
            downloads = (UILabel *)[cell.contentView viewWithTag:1002];

        }
        cell.textLabel.text = [[rssOutputData objectAtIndex:indexPath.row]xmlsinger];
        cell.detailTextLabel.text = [[rssOutputData objectAtIndex:indexPath.row]xmltitle];
        // custom menu view
        NSString *nibName = @"ABCellMailStyleMenuView";
        ABCellMenuView *menuView = [ABCellMenuView initWithNib:nibName bundle:nil];
        menuView.delegate = self;
        menuView.indexPath = indexPath;
        cell.rightMenuView = menuView;
        return cell;
}


   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
   {
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
   }

And these are the methods in cell class - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer and - (void)swipeGesture:(UIPanGestureRecognizer *)gesture here is when i swipe enter image description here


Solution

  • You can modified swipeGesture method will following code. it will show UITableViewCell as selected once you perform swipe operation.

    - (void)swipeGesture:(UIPanGestureRecognizer *)gesture {
        if (gesture.state == UIGestureRecognizerStateBegan) {
            NSInteger direction;
    
            // find swipe direction
            CGPoint velocity = [gesture velocityInView:self];
            if (velocity.x > 0) {
                // towards right - hide menu view
                direction = ABMenuUpdateHideAction;
            }
            else {
                // towards left - show menu view
                direction = ABMenuUpdateShowAction;
            }
    
    
            UITableView* tableView = (UITableView*)self.superview.superview;
    
            CGPoint swipeLocation = [gesture locationInView:tableView];
            NSIndexPath *swipedIndexPath = [tableView indexPathForRowAtPoint:swipeLocation];
    
            [tableView selectRowAtIndexPath:swipedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    
    
            [self updateMenuView:direction animated:YES];
        }
    }
    

    Hope this help you.