【问题标题】:UICollectionViewFlowLayout doesn't use integral framesUICollectionViewFlowLayout 不使用整帧
【发布时间】:2013-02-26 20:44:03
【问题描述】:

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

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

https://github.com/rmaz/BlurryCollectionView

这真的是标准行为吗?在我看来,这使得流布局在没有子类化的情况下基本上无法使用。还是我错过了什么?

【问题讨论】:

  • 我遇到了同样的错误。我的解决方案是使用 sectionInset 使单元格框架对齐。
  • 这适用于您的布局不需要旋转,但如果您的单元格必须遵循严格的设计,则不可能对两个方向使用相同的插图。为什么我们还要与这样的布局作斗争?奇怪的实现,如果你问我。
  • 您必须在“viewWillLayoutSubviews”中为不同的方向设置 sectionInset。我发现 UICollectionView 并没有看起来那么高效,但我切换到其他替代方案为时已晚。
  • 是的,不幸的是,我很快就得出了同样的结论。

标签: cocoa-touch ios6 uicollectionview


【解决方案1】:

解决方法:子类 UICollectionViewFlowLayout,覆盖 UICollectionViewLayout-layoutAttributesForElementsInRect: 并为每个布局属性使框架完整:

- (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 和更高版本中弃用它。

最好, 拉斐尔

【讨论】:

  • 这不是一个理想的解决方法,因为它会导致单元格之间的间距不均匀。
  • 这是对的,但我认为通过增加右侧部分的插图,您可以获得视觉上更好的结果,直到您在一行中的每个项目之间获得均匀的间距。
  • 通常这个选项在给定的布局约束中不可用,或者只是不需要。如果您仍然需要整体框架,例如为避免标签模糊,建议的解决方案似乎对大多数人都有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2013-08-27
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多