beginUpdates / endUpdates之后的意外表格单元格动画

时间:2014-01-28 10:55:41

标签: ios uitableview uiviewanimation

我有一个带静态单元格的表视图。单击单元格可切换与此单元格关联的选取器视图单元格的可见性(更改单元格高度)。单击单元格的tag属性维护选取器单元格的状态。动画由一系列beginUpdatesendUpdates方法触发。这是一种简单的方法来设置选择器单元的可见性(无需管理单元插入和删除)。

#pragma mark - Table view data source

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat defaultHeight = [super tableView:tableView heightForRowAtIndexPath:indexPath];

    switch (indexPath.row) {
        case RowIndexDayTimePicker:
            return self.dayTimeCell.tag > 0 ? defaultHeight : 0;

        case RowIndexPrivacyPicker:
            return self.privacyCell.tag > 0 ? defaultHeight : 0;

        default:
            return defaultHeight;
    }
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.row) {
        case RowIndexDayTime:
            self.dayTimeCell.tag *= -1;
            self.privacyCell.tag = -1;
            break;

        case RowIndexPrivacy:
            self.dayTimeCell.tag = -1;
            self.privacyCell.tag *= -1;
            break;

        default:
            break;
    }

    [tableView beginUpdates];
    [tableView endUpdates];
}

动画按预期工作,直到我将表视图分隔符属性设置为None才能使用自定义分隔符。比较两个截图(动画gif):

Table view Table view w/o separators

我不知道如何修复它。我使用autolayout,拾取器视图与superview对齐,每边都有零边距。在iOS 7 Simulator和iPos Touch下测试。故事板截图:

Storyboard

3 个答案:

答案 0 :(得分:2)

看起来像UITableView错误。

怎么样:

self.tableView.separatorColor = [UIColor whiteColor]; //or clearColor?

或者:

self.tableView.separatorInset = UIEdgeInsetsMake(0, CGRectGetWidth(self.view.bounds), 0, 0);

(目标是隐藏而不是删除分隔符。)

答案 1 :(得分:1)

我为表格单元格的高度变化动画玩了很多,遗憾的是我所知道的所有方法都存在一些问题。

尝试使用UITableView的此方法:

[UITableView reloadRowsAtIndexPaths:rowsToReload  withRowAnimation: UITableViewRowAnimationNone];

还尝试将UITableViewRowAnimationNone更改为UITableViewRowAnimationAutomatic(我发现UITableViewRowAnimationNone导致iPhone / iPod上的动画不正确)

对于我的项目,我以动画[tableView reloadData]方法结束:

[UIView transitionWithView: self.tableView duration: 0.3 options: UIViewAnimationOptionTransitionCrossDissolve animations:^{
    [self.tableView reloadData];
} completion: nil];

答案 2 :(得分:-2)

我认为你的桌子正在重装两次。 删除以下代码,它将起作用。

[tableView beginUpdates]; 
[tableView endUpdates];
相关问题