我有一个水平的collectionView,称为postsCollectionView,每个视图都与屏幕一样宽。目前,我正在使用以下方法计算currentPost的indexPath:
let currentPostIndex = Int(self.postsCollectionView.contentOffset.x / self.postsCollectionView.frame.size.width)
let currentPostIndexPath = IndexPath(row: currentPostIndex, section: 0)
当帖子被删除并且我已重置“ currentPost”时,我的View Controller中有这个骇人听闻的方法:
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if (postsFetchedResultsController.fetchedObjects?.count)! > 0 {
print(postsCollectionView.indexPathsForVisibleItems,postsCollectionView.contentOffset.x) //prints [],375.0
//HACK
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // change 2 to desired number of seconds
let currentPostIndex = Int(self.postsCollectionView.contentOffset.x / self.postsCollectionView.frame.size.width)
let currentPostIndexPath = IndexPath(row: currentPostIndex, section: 0)
self.currentPost = self.postsFetchedResultsController.object(at: currentPostIndexPath)
}
} else {
print("no items left")
}
}
基本上,有一个NSFetchedResultsController,它在数据源更改时调用collectionView的deleteItem方法。我正在使用回调didEndDisplaying单元,以尝试-完全删除该单元后,将self.currentPost设置为现在显示的已取代位置的帖子。
问题是我认为在删除单元格时会调用此回调,但是动画尚未完成,因此其偏移量仍为375(屏幕的宽度),因此即使当前索引路径为1,它应该为0,因为现在collectionView中只有1个帖子。
还有没有办法等到动画完成?还是有一种更好的方法来删除一个位于中心的集合视图单元格的新indexPath?
答案 0 :(得分:1)
1)为什么不将currentPost设置为nil并在实际需要时重新计算它,而不是在删除单元格后立即计算
2)您可以使用UICollectionView.indexPathForItem(指向CGPoint)获取IndexPath。这可能更安全。我想您传递的要点是
class TodoEffects {
@Effect() updateTodo = this.s.optimisticUpdate('UPDATE_TODO', {
run: (a: UpdateTodo, state: TodosState) => {
return this.backend(state.user, a.payload)
.pipe(
map(resp => ({
type: 'UPDATE_TODO_SUCCESS',
payload: resp
}))
);
}
y位置取决于您如何将单元格放置在集合视图中。
如果立即需要结果。您知道删除前的当前索引。如果要删除的单元格的索引小于或等于该索引,则增加当前索引,如果删除的单元格的索引较大,请不要更改它。