在setContentOffset之后,点击手势不起作用

时间:2013-05-18 15:31:10

标签: iphone ios objective-c uitableview uitapgesturerecognizer

我在UITableView上有一个UITapGestureRecognizer。在我调用方法scrollToRowAtIndexPath:atScrollPosition:animated:之前,它很有效。一旦调用它就不起作用。一旦我拨打setContentOffset:,它也无效。我必须用手指稍微滚动tableView,然后点击手势才能工作。如何在设置contentOffset或滚动到一行后让它工作?

-(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;
}

1 个答案:

答案 0 :(得分:0)

我不明白为什么它不适合你。我已经测试过它的确有效。 我的tableViewController是我委托的window.rootViewController的rootViewController这里没什么特别的,想法是有一个导航栏来放置一个按钮。

这是我的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

这是我的tableViewController.m(主要部分的摘录):

- (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");
}