7

我有一个UITableView我正在切换setEditing:animated:的,以允许用户插入和删除行。打开编辑时,我希望将新insert new item行添加到表中,然后我希望编辑控件像平常一样进行动画处理。我不希望新insert new item行使用淡入淡出之类的东西自行设置动画。我希望它只是出现,然后像任何现有的表数据源行一样滑入。

不过,这是由于我当前的代码而发生的事情(点击查看大图):

顶行做我想要的——它只是滑过,删除图标淡入。当它消失时,删除图标淡出,行再次展开。

第二行是我自己添加到表中的非数据源行。在出现时,它根本没有动画。插入图标和行同时出现并且不会滑入。当它消失时,行很好地扩展,但加号图标会随之滑动。动画是针对整行进行的,而不是针对加号图标然后单独行,就像第一行一样。

这是我的代码的简要介绍,但我认为提供类文件的链接可能会更好。

当按下工具栏上的编辑按钮时,我调用我的UIViewController方法setEditing:animated:。在这种方法中,我执行以下操作...

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    [super setEditing:editing animated:animated];

    // keep the table in the same editing mode
    [_table setEditing:editing animated:animated];

    if (editing) {

        [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];

    } else {

        [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];

    }

}

这是插入动画发生的地方。我尝试将整个内容包装在 [_table beginUpdate] 和 endUpdate 中,以及插入行。似乎都没有产生我想要的干净动画。

有什么想法我可能会错过吗?整个代码文件在这里:

https://github.com/ryancole/pound-client/blob/master/pound-client/controllers/ChannelListViewController.m#L106-L127

4

2 回答 2

2

超级调用会滑动“编辑”动画,所以如果你在它后面插入一些东西,它就不会参与其中。您要做的是在该调用之前插入行并在之后删除该行。您还需要使用不同的布尔值来跟踪行。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    _amEditing = editing;

    if (editing) {

        [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];

    } 

    [super setEditing:editing animated:animated];

    // keep the table in the same editing mode
    [self.view setEditing:editing animated:animated];

    if (!editing)
    {
        [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
    }


}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _amEditing ? _channels.count + 1 : _channels.count;
}

更新:

倒数第二行的图标仍然有一个奇怪的动画.. 要解决这个问题,您可以添加延迟删除..

    if (!editing)
    {
        [self performSelector:@selector(deleteLastRow) withObject:nil afterDelay:0.25];
    }

-(void) deleteLastRow
{
    [self.view deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_objects.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
}
于 2013-01-11T16:16:21.383 回答
1

正如评论的那样,您必须[super setEditing:editing animated:animated]在插入行后调用

 - (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    // remove this [super setEditing:editing animated:animated];

    // keep the table in the same editing mode
    [_table setEditing:editing animated:animated];

    if (editing) {

        [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];

    } else {

        [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];

    }
  [super setEditing:editing animated:animated]; // add it here

}
于 2013-01-11T16:54:50.790 回答