Cocoa touch UICollectionViewFlowLayout不';不要使用积分框架

Cocoa touch UICollectionViewFlowLayout不';不要使用积分框架,cocoa-touch,ios6,uicollectionview,Cocoa Touch,Ios6,Uicollectionview,我最近开始使用UICollectionView,对UICollectionViewFlowLayout有点困惑。似乎集合视图中每个单元格的帧都是在每个项之间具有相等空间的情况下计算的。这会导致某些单元格的帧具有分数位置,这将导致标签模糊和图像像素错位等 我很惊讶地发现,关于堆栈溢出问题没有任何疑问,这让我觉得我做错了什么。我创建了一个测试项目,非常简单地演示了这个问题: 这真的是标准行为吗?在我看来,如果没有子类化,这使得流布局基本上不可用。还是我遗漏了什么?解决方法:子类UICollecti

我最近开始使用UICollectionView,对UICollectionViewFlowLayout有点困惑。似乎集合视图中每个单元格的帧都是在每个项之间具有相等空间的情况下计算的。这会导致某些单元格的帧具有分数位置,这将导致标签模糊和图像像素错位等

我很惊讶地发现,关于堆栈溢出问题没有任何疑问,这让我觉得我做错了什么。我创建了一个测试项目,非常简单地演示了这个问题:


这真的是标准行为吗?在我看来,如果没有子类化,这使得流布局基本上不可用。还是我遗漏了什么?

解决方法:子类
UICollectionViewFlowLayout
,重写
UICollectionViewLayout
-LayoutAttributesForElementsRect:
,对于每个布局属性,使框架成为整体:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *allLayoutAttributes = [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes *layoutAttributes in allLayoutAttributes) {
        layoutAttributes.frame = CGRectIntegral(layoutAttributes.frame);
    }
    return allLayoutAttributes;
}
注意:iOS 7
UICollectionViewFlowLayout
已被修复为始终对其单元格帧使用整数帧。我建议保留iOS 6.x的修复程序,但有条件地不推荐iOS 7及更高版本的修复程序

最好的,
Raphael

这不是一个理想的解决方法,因为它会导致单元格之间的间距不均匀。如果您希望在没有休息的情况下不可分割的宽度内有完整的单元格,则根据定义,您将有不均匀的间距。这是真的,但我认为,通过增加右侧部分的插入,直到一行中每个项目之间的间距相等,可以获得更好的视觉效果。通常,在给定的布局约束内,此选项不可用,或者只是不需要。如果你仍然需要整体框架,例如避免标签模糊,建议的解决方案似乎可以帮助大多数人。我也遇到了同样的问题。我的解决方案是使用一个分段插入,这将使单元格框架对齐。如果布局不需要旋转,这是可行的,但如果单元格必须遵循严格的设计,则不可能对两个方向使用相同的插入。我们为什么要这样对抗布局?如果你问我的话,这个实现很奇怪。你必须在“viewWillLayoutSubviews”中为不同的方向设置sectionInset。我发现UICollectionView并不像它看起来那样有效率,但现在我转向其他替代品已经太晚了。是的,不幸的是,我很快就得出了同样的结论。