预设,
我有
的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
此处图片
更新 所以我发现它为什么会发生 - 这个行代码
attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);
查看是否删除转换
答案 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;
}