【问题标题】:UITableView callback after row deletion animation complete行删除动画完成后的UITableView回调
【发布时间】:2011-05-18 01:52:46
【问题描述】:

我有一张表格,上面有阴影,下面有阴影(在此处使用 Matt Gallagher 的解决方案:http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html)。这些是在 UITableView 类扩展的 layoutSubviews 方法中添加的。

我在每个主单元格下方动态添加和删除单元格(这些单元格提供了额外的数据)——我们将这些单元格称为“细节”单元格。一次只有一个开放。当删除最后一个主单元格下方的“细节单元格”时,随着动画的开始,阴影向上滑动到最后一个单元格(细节单元格上方)。这样做是因为 layoutSubview 方法认为表格的最后一个单元格在 deleteRowsAtIndexPaths 的动画开始时(而不是动画结束时)发生了变化。

所以,从本质上讲,我需要一种方法来保持细节单元格下方的阴影被删除。不确定执行此操作的最佳方法。如果 UITableView 不再认为该单元格是最后一个单元格,那么我什至不确定如何获取该单元格(因为 UITableView 获取了该单元格):

NSIndexPath *lastRow = [indexPathsForVisibleRows lastObject];
if ([lastRow section] == [self numberOfSections] - 1 &&
    [lastRow row] == [self numberOfRowsInSection:[lastRow section]] - 1)
 {
        //adds shadow below it here
     }

因此,如果 UITableView 仍然认为“详细”单元格上方的主单元格是“lastObject”,那么即使捕获动画的开始也没有多大用处。

感谢您的任何想法。

【问题讨论】:

  • 您是否尝试将顶部和底部阴影分别添加为tableHeaderView 和tableFooterView?当表格在删除动画后调整大小时,这些视图肯定会保持原位并适当移动。

标签: uitableview animation delete-row


【解决方案1】:

试试这个

[CATransaction begin];

[tableView beginUpdates];

//...

[CATransaction setCompletionBlock: ^{
    // Code to be executed upon completion
}];

[tableView deleteRowsAtIndexPaths: indexPaths
                 withRowAnimation: UITableViewRowAnimationAutomatic];


[tableView endUpdates];

[CATransaction commit];

【讨论】:

  • deleteRowsAtIndexPaths:withRowAnimation 动画完成后我需要刷新表格,这对我来说是这样。谢谢!也许在 2015 年有更好的方法?
【解决方案2】:

我相信您可以通过使用自定义表格视图类而不是使用来自外部框架的依赖项来轻松实现这一点,只需从 uitable 视图继承并向其添加子视图。

但如果你坚持要这样。在删除之前在您自己的变量中引用它。

【讨论】:

  • Matt Gallager 的阴影表视图是一个自定义表类...那么你的意思是什么?
  • 我的意思是,将子视图添加到该表视图并在该子视图中添加该渐变图像。
  • 好的,这是一个建议 - 但是您如何建议在哪里放置该视图?我在 OP 中提出的观点是,在删除最后一个单元格的动画开始的那一刻,[indexPathsForVisibleRows lastObject] 将立即反映上面的行。因此,如果这是您用来放置阴影的参考(就像现在一样),那么动画开始的那一刻,阴影就会向上滑动到上方的单元格。也许真正要做的是停止该阴影的更新,直到动画完成,或者上面的建议,改为使用 tableFooterView。一年前我放弃了-无论如何谢谢
  • 哦,在每个单元格之后添加阴影视图,并确保下一个单元格与前一个单元格的阴影重叠,这样就没有阴影移动。动画也会删除最后一个单元格的阴影。
  • 您可以通过调整每个单元格的高度来实现。
【解决方案3】:

Swift(思路一样,在obj-c中当然可以用这个):

UIView.animateWithDuration(0.3, animations: { () -> Void in
    self.tableView.scrollToRowAtIndexPath(indexPathes, withRowAnimation: UITableViewRowAnimation.None)
}, completion: { (Bool) -> Void in
    // The logic you want to execute after the animation
})

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 2020-05-11
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多