UICollectionView flowLayout没有正确包装单元格(iOS)


4 Answers

我在iPhone应用程序中发现了类似的问题。 搜索Apple dev论坛为我带来了这个合适的解决方案,它适用于我的案例,并且可能也适用于您的案例:

子类UICollectionViewFlowLayout并重写shouldInvalidateLayoutForBoundsChange以返回YES

//.h
@interface MainLayout : UICollectionViewFlowLayout
@end

//.m
#import "MainLayout.h"
@implementation MainLayout
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
    return YES;
}
@end
Question

我有一个UICollectionView的UICollectionView。 它会按我所预期的大部分时间工作,但是现在和其中一个单元格不能正确包装。 例如,如果实际上在第二行中出现尾随,并且只有一个应该在其中的空白空间(请参见下图),则该单元应位于第三行的第一个“列”中。 你所看到的这个胭脂细胞就是左手边(其余的被切除),它应该是空的。

这不会一致发生; 它并不总是相同的行。 一旦发生,我可以向上滚动,然后返回,单元格将自动修复。 或者,当我按下单元格(通过推动将我带到下一个视图)然后弹出时,我会看到单元格位置不正确,然后它会跳到正确的位置。

滚动速度似乎更容易重现问题。 当我慢慢地滚动时,我仍然可以看到单元格在错误的位置,然后马上跳到正确的位置。

当我添加节插图时,问题就开始了。 以前,我的单元格几乎与收集边界齐平(很少或没有插入),我没有注意到这个问题。 但是这意味着收集视图的右侧和左侧是空的。 即,不能滚动。 而且,滚动条并没有朝右齐平。

我可以在模拟器和iPad 3上发生问题。

我猜这个问题正在发生,因为左侧和右侧部分的插入...但是,如果价值是错误的,那么我会期望行为是一致的。 我想知道这是否会成为Apple的一个漏洞? 或者,这可能是由于内嵌物或类似物的积聚造成的......

任何解决方案/解决方法,赞赏。

后续行动 :我已经在下面用Nick的这个答案超过6个 月,现在12个月 2年没有问题(如果人们想知道这个答案是否有漏洞 - 我还没有找到任何答案)。 尼克做得好。




我刚刚遇到类似的问题, iOS 10中的 UICollectionView滚动后单元消失(iOS 6-9没有问题)。

UICollectionViewFlowLayout的子类化和重写方法layoutAttributesForElementsInRect:在我的情况下不起作用。

解决方案很简单。 目前我使用UICollectionViewFlowLayout的一个实例并设置itemSize和estimatedItemSize (我之前没有使用estimatedItemSize)并将其设置为某个非零大小。 实际大小在collectionView:layout:sizeForItemAtIndexPath:方法中进行计算。

此外,我已从layoutSubviews中移除了invalidateLayout方法的调用,以避免不必要的重新加载。




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设置为小于顶部插入的值。




上述答案对我来说不起作用,但下载完图像后,我将其替换

[self.yourCollectionView reloadData]

[self.yourCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];

刷新并且可以正确显示所有单元格,您可以尝试它。




Related