编程技术记录

世界你好!

默认情况下,使用UICollectionViewFlowLayout布局的UICollectionView 的 添加元素,没多一行就会会有自动向上滚动。UITableView的效果也是类似的。
(相对于用户来说)为了保持屏幕定位不变,也就是用户操作的某个cell在屏幕上的位置不变,可以这样做:
获取一行的高度,设置UICollectionView的contentOffset,使向反方向滚动一行,然后立即添加元素

示意代码

//在performBatchUpdates中批量执行
[collectionView performBatchUpdates:^{
                    // 禁用动画效果
                    [UIView setAnimationsEnabled:NO];
                    //添加元素
                    [collectionView insertItemsAtIndexPaths:@[addIndp]];
                    if (新增一行)
                    { 
                        //  计算一行高度
                        CGFloat oneLineHeight= 1000;
                        CGFloat oneTop = 0;
                        for (UICollectionViewCell  * cell in _collectionView.visibleCells)
                        {
                            if (oneTop <= 0 ) {
                                oneTop = cell.top;
                            }
                            else if (oneTop != cell.top)
                            {
                                CGFloat tmp = (cell.top - oneTop);
                                tmp = ABS(tmp);
                                if (tmp > 1 && oneLineHeight > tmp )
                                {
                                    oneLineHeight = tmp;
                                }
                            }
                        }
                        //向上滚动一行
                        CGPoint offset = collectionView.contentOffset;
                        offset.y += oneLineHeight;
                        collectionView.contentOffset = offset;
                    }
                } completion:^(BOOL finished) {
                    //开启动画效果
                    [UIView setAnimationsEnabled:YES];
                }];

© Beli. All Rights Reserved.