UICollectionView内置重新排序对于不同大小的单元格无法正常工作

时间:2016-07-22 03:53:04

标签: ios uicollectionview

UICollectionView添加了对iOS 9中重新排序单元格的支持,但如果所有单元格大小不同,则实时交互无法正常工作:

请注意,在此屏幕中,捕获具有相同大小的交换单元#3和#2如何正常工作,而不是单元#3和#1:

enter image description here

基本上,UICollectionView在移动所选单元格时不会重新计算其他单元格的布局。有谁知道一项工作?

另一个相关问题是,当完成不同大小的单元格的重新排序时,您需要手动使UICollectionView布局无效,否则某些单元格的位置无效且重叠。

PS:我正在使用长按手势识别器并根据需要调用这些方法:

- (BOOL)beginInteractiveMovementForItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0); // returns NO if reordering was prevented from beginning - otherwise YES
- (void)updateInteractiveMovementTargetPosition:(CGPoint)targetPosition NS_AVAILABLE_IOS(9_0);
- (void)endInteractiveMovement NS_AVAILABLE_IOS(9_0);
- (void)cancelInteractiveMovement NS_AVAILABLE_IOS(9_0);

1 个答案:

答案 0 :(得分:2)

对于遇到此问题的用户,原因是UICollectionView在拖动过程中没有为项目重新排列布局属性

我的意思是,如果第2项是50x50且第3项是100x100,在实时拖动项目并交换它们时,UICollectionView也不会自动交换它们的尺寸。无论位置2处的是什么,总是假设为50x50,而位置3处的任何位置始终假设为100x100。

解决方案是确保在移动项目时,UICollectionView数据源连续更新以反映新位置。最好的方法是使用UICollectionView委托方法:

- (NSIndexPath *)collectionView:(UICollectionView *)collectionView
       targetIndexPathForMoveFromItemAtIndexPath:(NSIndexPath *)originalIndexPath
       toProposedIndexPath:(NSIndexPath *)proposedIndexPath