为集合视图单元格设置自动布局宽度和高度约束的最佳做法?

时间:2014-12-07 20:12:56

标签: ios swift uicollectionview autolayout uicollectionviewcell

我正在设计一个用swift构建的ios 8应用程序的UI。我对autolayout和约束有中级知识。这是我的情况:我有一个自定义集合视图控制器和集合视图单元格。我想在界面构建器中使用“等宽”和“相等高度”约束来设置单元格的宽度和高度相对于父视图的乘数 - 而不是使用固有的高度/宽度属性,如320 x 94。

这是我试过的

  1. 使用IB内部大小类的固有宽度和高度。 (这不起作用)
  2. 控制 - 从UICollectionViewCell拖动到CollectionView(看不到“等高”和“等宽”甚至不是约束选项)
  3. 我应该满足于内在的高度和宽度,并假设CollectionViewFlowLayout会照顾我,还是有办法以编程方式执行此操作?

    感谢。 亚历

2 个答案:

答案 0 :(得分:0)

使用UICollectionViewDelegateFlowLayout方法调整单元格大小

例如,如果您想在视图宽度上放置3个单元格

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
    let width = CGRectGetWidth(collectionView.bounds)
    let hcount = 3
    let gapcount = CGFloat(hcount) + 1
    //this should be a class var/constant which you can feed into the minimumLineSpacingForSectionAtIndex delegate
    let gap = 10 
    let kwidth = width - gap
    let keywidth = kwidth/CGFloat(hcount)

    return CGSize(width:keywidth,height:50)
}

您可以使用

调整单元格之间的距离

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat

和边缘插入

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets

答案 1 :(得分:0)

单元格的布局和大小由 collectionView collectionViewLayout 属性完成。使用类UICollectionViewFlowLayout的 collectionViewLayout ,您可以使用item size属性设置固定大小:

(collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.itemSize = 100 //set fixed size here

或使用委托方法设置变量大小:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    // determine variable size here using indexPath value
}