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.