滚动时奇怪的消失项目

Strange disappearing items when scrolls

预设,

我有 collectionViewFlowLayout 子类

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    return YES;
   }

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *arr = [super layoutAttributesForElementsInRect:rect];
    BBLog(@"ARRA:%@", arr);
    for (UICollectionViewLayoutAttributes *attr in arr) {
        if (CGAffineTransformIsIdentity(attr.transform)) {
            attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);
        }
    }

    return arr;
}

CollectionView 旋转到上下滚动

 self.collectionView.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);

但是即使只使用原生的 collectionViewFlowLayout 而没有子类化,git 这个错误

问题

我在聊天中有两条消息和更多消息,但是当滚动到底部(通常是顶部)时第二条消失了。

给定矩形的layoutAttributesForElementsInRect return 两个indexPaths 0-0 和0-1 的两个属性,但是委托方法

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

仅为 indexPath 0-0 调用

这里是图片

更新 所以我找到了为什么会这样——这行代码

attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);

看是否去掉变换

对不起,所有,但我找到了原因并解决了。

这只发生在设备上而不发生在模拟器上

看三个CGRects

iPhone5S

(CGRect) oldFrame = (origin = (x = -0.000000000000056843418860808015, y = 0), size = (width = 320.00000000000006, height = 314.00000000000006))

iPhone5C

(CGRect) oldFrame = (origin = (x = 0, y = 0), size = (width = 320, height = 314))

英特尔酷睿模拟器

(CGRect) oldFrame = (origin = (x = 0, y = 0), size = (width = 320, height = 314))

我通过

对他们所有人应用旋转变换
CGAffineTransformMakeRotation((CGFloat)M_PI)

首先是iPhone5SARM Apple A7CPU

第二个是iPhone5CARM Apple A6CPU

第三个是在 Intel Core iX 处理器的模拟器上。

所以,我的解决方法是:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewLayoutAttributes *retAttr = [super layoutAttributesForItemAtIndexPath:indexPath];

    if (CGAffineTransformIsIdentity(retAttr.transform)) {
        retAttr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);
    }

    CGRect oldFrame = retAttr.frame;

    oldFrame.origin.x = retAttr.frame.origin.x > 0 ?: 0;

    retAttr.frame = oldFrame;

    return retAttr;
}

我不完全确定,但我认为,当您对 UICollectionViewFlowLayout 进行子类化时,您不应该直接修改属性,而是要复制属性,修改它 return它。

顶部语句的简短说明: 您将不得不继承 UICollectionViewFlowDelegate(UICollectionViewDelegateFlowLayout 的父类),而不是创建自己的属性并根据需要修改它们,但这将需要实现更多的自定义逻辑。

同时查看您是否在控制台中收到任何错误或警告。

看看这个问题:

希望我至少能帮上一点忙。