简体   繁体   中英

Tap gesture doesn't work after setContentOffset

I have a UITapGestureRecognizer on a UITableView. It works great until I call the method scrollToRowAtIndexPath:atScrollPosition:animated: . It doesn't work once that's called. It also doesn't work once I call setContentOffset: . I have to actually scroll the tableView with my finger a little bit, and then the tap gesture will work. How can I get it to work after setting the contentOffset or scrolling to a row?

-(void)viewDidLoad {
    // The gesture that doesn't work after 'setContentOffset:'
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(hideShowEditing:)];
    [tap setCancelsTouchesInView: YES];
    [tap setDelegate: self];

    [self setEditTap: tap];
    [[self tableView] addGestureRecognizer: tap];
}


-(BOOL)hideShowEditing:(UIGestureRecognizer *)gesture
{
    CGPoint location = [gesture locationInView: [self tableView]];
    NSIndexPath *ip = [[self tableView] indexPathForRowAtPoint: location];
    TaskCell *cell = (TaskCell *)[[self tableView] cellForRowAtIndexPath: ip];

    // No cells are expanded, so expand this one
    if (editingCellRow == -1 && editingCellSection == -1 && ![gesture isKindOfClass: [UISwipeGestureRecognizer class]]) {

        editingCellRow = [ip row];                          // if it's a swipe gesture, then it's from the crossOut method
        editingCellSection = [ip section];

        [[self tableView] beginUpdates];
        [[self tableView] endUpdates];

        [cell addViewsForEditing];

        // Tap gesture only doesn't work if it has to scroll the tableView
        [[self tableView] scrollToRowAtIndexPath: ip atScrollPosition: UITableViewScrollPositionNone animated: YES];

        return YES;
    }
    // Another cell is expanded, so unexpand the other cell
    // and expand this cell
    else if ((editingCellRow != [ip row] || editingCellSection != [ip section]) && ![gesture isKindOfClass: [UISwipeGestureRecognizer class]]) {

        // Index path of the expanded cell
        NSIndexPath *expandedIp = [NSIndexPath indexPathForRow: editingCellRow inSection: editingCellSection];
        TaskCell *expandedCell = (TaskCell *)[[self tableView] cellForRowAtIndexPath: expandedIp];

        [expandedCell setAnimateExpansion: YES];
        [cell setAnimateExpansion: YES];

        // Store the index of the new expanded cell
        editingCellRow = [ip row];
        editingCellSection = [ip section];

        [[self tableView] beginUpdates];
        [[self tableView] endUpdates];

        [expandedCell removeViewsForEditing];

        [[self tableView] scrollToRowAtIndexPath: ip atScrollPosition: UITableViewScrollPositionNone animated: YES];

        [cell addViewsForEditing];

        return YES;
    }
    // Tapped the expanded cell, so unexpand it
    else if (editingCellRow == [ip row] && editingCellSection == [ip section]) {
        [cell setAnimateExpansion: YES];

        editingCellRow = -1;
        editingCellSection = -1;

        [[self tableView] beginUpdates];
        [[self tableView] endUpdates];

        [cell removeViewsForEditing];

        return YES;
    }

    return NO;
}

I don't understand why it doesn't for you. I've tested and it works. My tableViewController is the rootViewController of my delegate's window.rootViewController Nothing special here, the idea is to have a navbar to put a button in it.

This my tableViewController.h :

#import <UIKit/UIKit.h>

@interface ViewController : UITableViewController <UIGestureRecognizerDelegate>

// scrolling method
- (void)move:(id)sender;

// method triggered by the tap
- (void)tapIt:(id)sender;

@end

This my tableViewController.m (an extract of the main part):

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Add a bar button to call the scrolling method
    UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(move:)];
    self.navigationItem.rightBarButtonItem = rightBtn;

    //add tap gesture
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapIt:)];
    [tap setCancelsTouchesInView:YES];
    [tap setDelegate:self];
    tap.numberOfTouchesRequired = 1;
    tap.numberOfTapsRequired = 1;
    [[self tableView] addGestureRecognizer:tap];
}

#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.textLabel.text = [NSString stringWithFormat:@"item %i", indexPath.row];

    return cell;
}

// the scrolling method
- (void)move:(id)sender
{
    NSLog(@"scroll");
    //scroll to 17th row for exemple
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:17 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

// method triggered by the tap gesture
- (void)tapIt:(id)sender
{
    NSLog(@"tap it");
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM