我已经实施了scrollViewWillEndDragging
委托方法,因此我可以向myCollectionView
添加新的单元格,其中myCollectionView
目前只显示一个collectionViewCell
。如果用户到达目的地,我希望用户滚动“进入”新单元格,以便当用户向左滑动时,将创建一个新单元格,并且UI将以该新单元格为中心。
要做到这一点,我已经以两种方式实现了它
第一种方式(使用insertItemsAtIndexPaths):
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
// calculate the page, which is the current cell we are on
if (page == dataSource.count) {
// Update data source
let placeholderFlashCardProxy = FlashCardProxy(phrase: nil, pronunciation: nil, definition: nil)
dataSource.append(placeholderFlashCardProxy)
// Update collection view controller
let newIndexPath = NSIndexPath(forItem: addedCards.count -1 , inSection: 0)
myCollectionView.insertItemsAtIndexPaths([newIndexPath])
}
print("Centering on new cell")
// Center the cardCollectionView on the new page
let newOffset = CGFloat(page * Int((cellWidth + cellPadding)))
targetContentOffset.memory.x = newOffset
}
插入新项目的问题是UI在创建新单元格时不会居中。
第二种方式(使用reloadData)
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
// calculate the page, which is the current cell we are on
if (page == dataSource.count) {
// Update data source
let placeholderFlashCardProxy = FlashCardProxy(phrase: nil, pronunciation: nil, definition: nil)
dataSource.append(placeholderFlashCardProxy)
// Update collection view controller
myCollectionView.reloadData()
}
print("Centering on new cell")
// Center the cardCollectionView on the new page
let newOffset = CGFloat(page * Int((cellWidth + cellPadding)))
targetContentOffset.memory.x = newOffset
}
使用reloadData()
方法我将UI置于新创建的单元格中,尽管我不知道为什么。我打印了两种方法的偏移量,它们都是相同的,尽管使用insertItemsAtIndexPath
似乎并没有将UI置于新创建的单元格中心,尽管偏移量与使用reloadData()
相同。谁能告诉我为什么会这样?我问这个的原因是因为我想覆盖动画以添加新的collectionViewCell
。