我在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;
}
答案 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");
}