滚动时奇怪的消失项目
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 的父类),而不是创建自己的属性并根据需要修改它们,但这将需要实现更多的自定义逻辑。
同时查看您是否在控制台中收到任何错误或警告。
看看这个问题:
希望我至少能帮上一点忙。
预设,
我有 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 的父类),而不是创建自己的属性并根据需要修改它们,但这将需要实现更多的自定义逻辑。
同时查看您是否在控制台中收到任何错误或警告。
看看这个问题:
希望我至少能帮上一点忙。