滚动时奇怪的消失项目

Dmi*_*pov 8 ios uicollectionview uicollectionviewcell uicollectionviewlayout uicollectionviewdelegate

预设,

我有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;
}
Run Code Online (Sandbox Code Playgroud)

CollectionView旋转到倒置滚动

 self.collectionView.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);
Run Code Online (Sandbox Code Playgroud)

但即使jus使用本机collectionViewFlowLayout而没有子类化,也就是git这个错误

问题

我在聊天中有两条消息,但是当在底部滚动(通常是顶部)消失第二项时.

给定rect的layoutAttributesForElementsInRect为两个indexPaths 0-0和0-1返回两个属性,但委托方法

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

仅调用indexPath 0-0

这里的图片

TopScroll 在此输入图像描述

更新 所以我发现为什么会发生 - 这个行代码

attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);
Run Code Online (Sandbox Code Playgroud)

看看是否删除转换

在此输入图像描述

Dmi*_*pov 0

抱歉,大家,但我找到了原因并解决了问题。

这种情况仅发生在设备上而不是模拟器上

看三个CGRect

iPhone 5S

(CGRect) oldFrame = (origin = (x = -0.000000000000056843418860808015, y = 0), size = (width = 320.00000000000006, height = 314.00000000000006))
Run Code Online (Sandbox Code Playgroud)

iPhone 5C

(CGRect) oldFrame = (原点 = (x = 0, y = 0), 大小 = (宽度 = 320, 高度 = 314))

模拟器英特尔酷睿

(CGRect) oldFrame = (origin = (x = 0, y = 0), size = (width = 320, height = 314))
Run Code Online (Sandbox Code Playgroud)

对于他们所有人,我通过以下方式应用旋转变换

CGAffineTransformMakeRotation((CGFloat)M_PI)
Run Code Online (Sandbox Code Playgroud)

首先是在 iPhone 5S ARM Apple A7 CPU上

其次是 iPhone 5C ARM Apple A6 CPU

第三是在 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;
}
Run Code Online (Sandbox Code Playgroud)