滚动

时间:2016-01-19 13:15:05

标签: 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;
}

CollectionView使用

旋转到上下滚动
 self.collectionView.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);

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

问题

我在聊天中有两条消息和更多消息,但在底部滚动(正常顶部)消失第二项。

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

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

仅调用indexPath 0-0

此处图片

TopScroll enter image description here

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

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

查看是否删除转换

enter image description here

2 个答案:

答案 0 :(得分:1)

我不完全确定,但我认为,当你是UICollectionViewFlowLayout的子类时,你不应该直接修改属性,而是要复制属性,改为修改它并返回它。

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

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

查看此问题:Warning: UICollectionViewFlowLayout has cached frame mismatch for index path 'abc'

希望我至少有一点帮助。

答案 1 :(得分:0)

抱歉,所有,但我找到了理由和解决方法。

仅在不在模拟器上的设备上发生

看看三个CGRects

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;
}