如何以编程方式将纵横比约束应用于自定义 UICollectionViewCell?

Posted

技术标签:

【中文标题】如何以编程方式将纵横比约束应用于自定义 UICollectionViewCell?【英文标题】:How do I apply aspect ratio constraints to a custom UICollectionViewCell programmatically? 【发布时间】:2015-05-08 19:23:47 【问题描述】:

我正在尝试创建一个显示相册封面的网格样式视图。我想要每行 3 张专辑封面。棘手的部分是让单元格根据使用的设备适当增加大小,例如iPhone 4s/5/5s/5c/6/6 plus,无论使用什么设备,每行始终显示 3 个项目/单元格。

我从来没有能够做到这一点。我正在考虑像这样手动设置尺寸:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
    if DeviceHelper.DeviceType.IS_IPHONE_4_OR_LESS 
        return CGSizeMake(115, 140)
     else if DeviceHelper.DeviceType.IS_IPHONE_5 
        return //size
     else if DeviceHelper.DeviceType.IS_IPHONE_6 
        return //size
     else 
        return //size 
    

我有一个帮助器来确定正在使用的设备,我可以从应用程序中的任何位置调用它。但是有没有办法确保无论使用什么设备,每行都始终显示 3 个单元格,并且还显示相同的填充,如下所示:

纵横比限制很有帮助,但这次我无法将它们应用到单元格,因为界面生成器不允许这样做。有没有直接的方法可以做到这一点?

提前感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

删除默认单元格间距:

试试这个代码:

只需设置 numberOfCellInRow 的值即可获得集合视图中一行单元格的数量

Obj-C

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

   int numberOfCellInRow = 3;
   CGFloat padding = 5.0;
   CGFloat collectionCellWidth =  [[UIScreen mainScreen] bounds].size.width/numberOfCellInRow;
   CGFloat finalWidthWithPadding = collectionCellWidth - padding;
   return CGSizeMake(finalWidthWithPadding , finalWidthWithPadding);

斯威夫特

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
    var numberOfCellInRow : Int = 3
    var padding : Int = 5
    var collectionCellWidth : CGFloat = (self.view.frame.size.width/CGFloat(numberOfCellInRow)) - CGFloat(padding)
    return CGSize(width: collectionCellWidth , height: collectionCellWidth)

我认为它适用于所有设备。

【讨论】:

只是想把它转换成 swift。 这对我不起作用。每行有 2 个项目,中间有很大的间隙。 现在可以使用了,谢谢。你能修改代码以包含填充吗? 让我们continue this discussion in chat. 缺少垂直填充,并且您假设集合视图单元格是正方形。 OP不是在问保持单元格的纵横比吗?

以上是关于如何以编程方式将纵横比约束应用于自定义 UICollectionViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式快速更改纵横比约束

AutoLayout约束以适应矩形内的视图,保持一定的纵横比(以编程方式)

如何使用papercrop gem将纵横比设置为不受限制的比例?

了解纵横比约束和乘数

以编程方式设置自动布局约束

调整图像大小并裁剪为新的纵横比