相关疑难解决方法(0)

具有自动布局的UICollectionView自定义单元格

我正在尝试UICollectionViewCells使用自动布局进行自我调整,但我似乎无法让单元格根据内容调整自己的大小.我无法理解如何根据单元格内容中的内容更新单元格的大小.

这是我尝试过的设置:

  • 在其contentView中自定义UICollectionViewCell一个UITextView.
  • 滚动显示UITextView已禁用.
  • contentView的水平约束是:"H:| [_textView(320)]",即UITextView固定在单元格左侧,显式宽度为320.
  • contentView的垂直约束是:"V:| -0 - [_ textView]",即UITextView固定到单元格的顶部.
  • UITextView具有高度限制设置为其中一个恒定的UITextView报告将适合文本.

这是单元格背景设置为红色,UITextView背景设置为蓝色的样子: 细胞背景红色,UITextView背景蓝色

我把我已经在GitHub上玩的项目在这里.

ios autolayout uicollectionview uicollectionviewcell

192
推荐指数
7
解决办法
20万
查看次数

使用自动布局在UICollectionView中指定单元格的一个维度

在iOS 8中,UICollectionViewFlowLayout支持根据自己的内容大小自动调整单元格大小.这根据其内容在宽度和高度上调整单元的大小.

是否可以为所有单元格的宽度(或高度)指定固定值,并允许其他尺寸调整大小?

对于一个简单的示例,请考虑单元格中的多行标签,其中约束将其定位到单元格的两侧.可以通过不同方式调整多行标签的大小以容纳文本.单元格应填充集合视图的宽度并相应地调整其高度.相反,单元格的大小是随意调整的,当单元格大小大于集合视图的不可滚动维度时,它甚至会导致崩溃.


iOS 8引入了方法systemLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority:对于集合视图中的每个单元格,布局在单元格上调用此方法,传入估计的大小.对我来说有意义的是在单元格上覆盖此方法,传递给定的大小并将水平约束设置为required,并将垂直约束设置为低优先级.这样,水平尺寸固定为布局中设置的值,垂直尺寸可以灵活.

像这样的东西:

- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
    attributes.size = [self systemLayoutSizeFittingSize:layoutAttributes.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel];
    return attributes;
}
Run Code Online (Sandbox Code Playgroud)

然而,这种方法给出的尺寸是完全奇怪的.关于这种方法的文档对我来说是非常不清楚的,并提到使用UILayoutFittingCompressedSize UILayoutFittingExpandedSize仅代表零大小和相当大的常量.

size这个方法的参数真的只是传递两个常量的方法吗?难道没有办法实现我期望获得给定大小的适当高度的行为吗?


替代解决方案

1)添加将为单元格指定特定宽度的约束可实现正确的布局.这是一个糟糕的解决方案,因为该约束应该设置为单元的集合视图的大小,它没有安全的引用.在配置单元格时,可以传入该约束的值,但这似乎也完全违反直觉.这也很尴尬,因为直接向单元格或其内容视图添加约束会导致许多问题.

2)使用表格视图.由于单元格具有固定的宽度,因此表视图以这种方式开箱即用,但这不适用于其他情况,例如在多列中具有固定宽度单元格的iPad布局.

objective-c ios autolayout uicollectionview

110
推荐指数
3
解决办法
5万
查看次数