Clicked Header Section滚动到顶部

我有以下自定义headerview实现。 当用户单击headerView时,它会展开以显示相应的单元格。

我们假设我有两个部分。 并且第一部分被扩展,第二部分被折叠。 当我单击第二部分时,我希望此部分滚动到顶部。

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { ExpandableHeaderFooterView *sectionHeaderView = [self.comboTableView dequeueReusableHeaderFooterViewWithIdentifier:SectionHeaderViewIdentifier]; if (sectionHeaderView == nil) { sectionHeaderView = [[ExpandableHeaderFooterView alloc] initWithReuseIdentifier:SectionHeaderViewIdentifier]; } UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectHeaderAction:)]; [sectionHeaderView addGestureRecognizer:tapGesture]; return sectionHeaderView; } -(void) selectHeaderAction :(UITapGestureRecognizer*) gestureRecognizer { ExpandableHeaderFooterView* cell = (ExpandableHeaderFooterView*)gestureRecognizer.view; [self toggleSection:cell withSection: cell.section]; } -(void)toggleSection:(ExpandableHeaderFooterView *)headerView withSection:(int)section { ((ComboItem*)comboItemsArray[section]).expanded = !((ComboItem*)comboItemsArray[section]).expanded; [comboTableView beginUpdates]; for (int i = 0; i< ((ComboItem*)comboItemsArray[section]).allComboItems.count; i++) { NSArray* rowsToReload = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:i inSection:section], nil]; [comboTableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationFade]; } NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:section]; [comboTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; [comboTableView endUpdates]; } 

由于Fade需要大约半秒才能执行,你会看到那个轻弹。 你需要做的是给TableViewScroll一个小的延迟,或者只是使用:

 [CATransaction begin]; [comboTableView beginUpdates]; [CATransaction setCompletionBlock: ^{ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:section]; [comboTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; }]; for (int i = 0; i< ((ComboItem*)comboItemsArray[section]).allComboItems.count; i++) { NSArray* rowsToReload = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:i inSection:section], nil]; [comboTableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationFade]; } [comboTableView endUpdates]; [CATransaction commit];