8

预设,

我有 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 返回两个 indexPaths 0-0 和 0-1 的属性,但委托方法

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

只为 indexPath 0-0 调用

这里图片

顶部滚动 在此处输入图像描述

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

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

看看是否删除变换

在此处输入图像描述

4

2 回答 2

1

我不完全确定,但我认为,当你继承 UICollectionViewFlowLayout 时,你不应该直接修改属性,而是制作属性的副本,修改它并返回它。

顶部语句的简短解释:您必须继承 UICollectionViewFlowDelegate ( UICollectionViewDelegateFlowLayout 的父级),然后创建自己的属性并根据需要修改它们,但这需要实现更多自定义逻辑。

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

看看这个问题:警告:UICollectionViewFlowLayout has cached frame mismatch for index path 'abc'

希望我至少有点帮助。

于 2016-02-05T15:44:30.943 回答
0

对不起,所有人,但我找到了理由并解决了问题。

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

看三个CGRect

iPhone 5S

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

iPhone 5C

(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)

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

其次它在 iPhone 5C ARM Apple A6 CPU上

第三,它在英特尔酷睿 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;
}
于 2016-02-03T11:03:19.830 回答