ios6 UICollectionView flowLayout没有正确包装单元格(iOS)
我在iPhone应用程序中发现了类似的问题。 搜索Apple dev论坛为我带来了这个合适的解决方案,它适用于我的案例,并且可能也适用于您的案例:
子类UICollectionViewFlowLayout
并重写shouldInvalidateLayoutForBoundsChange
以返回YES
。
//.h
@interface MainLayout : UICollectionViewFlowLayout
@end
和
//.m
#import "MainLayout.h"
@implementation MainLayout
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
return YES;
}
@end
我有一个UICollectionView
的UICollectionView。 它会按我所预期的大部分时间工作,但是现在和其中一个单元格不能正确包装。 例如,如果实际上在第二行中出现尾随,并且只有一个应该在其中的空白空间(请参见下图),则该单元应位于第三行的第一个“列”中。 你所看到的这个胭脂细胞就是左手边(其余的被切除),它应该是空的。
这不会一致发生; 它并不总是相同的行。 一旦发生,我可以向上滚动,然后返回,单元格将自动修复。 或者,当我按下单元格(通过推动将我带到下一个视图)然后弹出时,我会看到单元格位置不正确,然后它会跳到正确的位置。
滚动速度似乎更容易重现问题。 当我慢慢地滚动时,我仍然可以看到单元格在错误的位置,然后马上跳到正确的位置。
当我添加节插图时,问题就开始了。 以前,我的单元格几乎与收集边界齐平(很少或没有插入),我没有注意到这个问题。 但是这意味着收集视图的右侧和左侧是空的。 即,不能滚动。 而且,滚动条并没有朝右齐平。
我可以在模拟器和iPad 3上发生问题。
我猜这个问题正在发生,因为左侧和右侧部分的插入...但是,如果价值是错误的,那么我会期望行为是一致的。 我想知道这是否会成为Apple的一个漏洞? 或者,这可能是由于内嵌物或类似物的积聚造成的......
任何解决方案/解决方法,赞赏。
后续行动 :我已经在下面用Nick的这个答案超过6个 月,现在12个月 2年没有问题(如果人们想知道这个答案是否有漏洞 - 我还没有找到任何答案)。 尼克做得好。
Nick Snyder的答案是:
class NDCollectionViewFlowLayout : UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElements(in: rect)
let contentSize = collectionViewContentSize
return attributes?.filter { $0.frame.maxX <= contentSize.width && $0.frame.maxY < contentSize.height }
}
}
我已经向苹果添加了一个错误报告。 什么对我有用是将bottomInset设置为小于顶部插入的值。
我刚刚遇到类似的问题, iOS 10中的 UICollectionView滚动后单元消失(iOS 6-9没有问题)。
UICollectionViewFlowLayout的子类化和重写方法layoutAttributesForElementsInRect:在我的情况下不起作用。
解决方案很简单。 目前我使用UICollectionViewFlowLayout的一个实例并设置itemSize和estimatedItemSize (我之前没有使用estimatedItemSize)并将其设置为某个非零大小。 实际大小在collectionView:layout:sizeForItemAtIndexPath:方法中进行计算。
此外,我已从layoutSubviews中移除了invalidateLayout方法的调用,以避免不必要的重新加载。
上述答案对我来说不起作用,但下载完图像后,我将其替换
[self.yourCollectionView reloadData]
同
[self.yourCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
刷新并且可以正确显示所有单元格,您可以尝试它。