如何设置动态宽度 UICollectionViewCell

Posted

技术标签:

【中文标题】如何设置动态宽度 UICollectionViewCell【英文标题】:How to Set Dynamic Width UICollectionViewCell 【发布时间】:2017-08-10 08:41:05 【问题描述】:

我构建了一个 ios 应用程序,并将 Collection View 与 Collection View Cell 结合使用。我已经将 Collection View 约束设置为主视图。但是,但是,如果我运行该应用程序,它会给出不同的结果。甚至,在 iPhone 5 版本中,内容与屏幕宽度重叠。

请看下面的截图

集合视图的内容与屏幕大小重叠。请与下面的 iPhone 7 和 7plus 版本进行比较

这是 iPhone 7p 版本

我已经尝试为上、左、下、右设置特定约束,但它没有给出任何结果。这是我的视图控制器故事板

我搜索了整个网站,但我只找到了如何设置动态高度,而不是宽度。我只想设置动态宽度,因为内容高度是恒定的。谁能给我一些建议?

注意:这是我的收藏视图代码(可能有人想看)

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
    let screenSize: CGRect = UIScreen.main.bounds


    return CGSize(width: collectionPromo.bounds.size.width, height: collectionPromo.collectionViewLayout.collectionViewContentSize.height);

我尝试设置该代码的动态宽度(我在互联网上找到的)

注意:这不是图像视图内容模式的问题,因为重叠的是整个内容(包括标签),而不仅仅是图像视图 这是我的收藏视图代码

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellPromo", for: indexPath)

    var labelPromo = cell.viewWithTag(3) as! UILabel
    labelPromo.text = list[indexPath.row].Period

    var imagePromo = cell.viewWithTag(2) as! UIImageView
    let promimg = try? UIImage(data: Data(contentsOf: URL(string: list[indexPath.row].ImageUrl)!))
    imagePromo.image = promimg!
    imagePromo.contentMode = UIViewContentMode.scaleAspectFit
    //imagePromo.layer.masksToBounds = true
    imagePromo.clipsToBounds = true


    cell.layer.masksToBounds = false
    cell.layer.borderColor = UIColor.white.cgColor
    cell.layer.borderWidth = 5.0
    //cell.layer.contentsScale = UIScreen.main.scale
    cell.layer.shadowOpacity = 0.25
    cell.layer.shadowRadius = 5.0
    cell.layer.shadowOffset = CGSize.zero
    cell.layer.shadowPath = UIBezierPath(rect: cell.bounds).cgPath
    cell.layer.shouldRasterize = true
    cell.layer.backgroundColor = UIColor.white.cgColor


    return cell

【问题讨论】:

图像视图有什么限制? 看故事板(右侧部分) 我认为你为 iphone 7 固定了 collectionview 的宽度,所以它在 iphone 5 中溢出 @PhuDuy 如何使其动态化?我只是设置了上下左右约束 @christ2702 您尝试将视图更改为 iphone 5,我发现您的图像中存在与宽度相关的约束 【参考方案1】:

使用 collectionView 方法设置 CollectionView 的边缘。 Collection View 自动计算其动态宽度。

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

    return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

或者你可以使用这个。

但尝试将以下代码放入 viewDidLoad() 中:

collectionView!.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

这将为 collectionView 的每一侧添加填充。

【讨论】:

【参考方案2】:

您可以为图像视图添加背景颜色。并在方面适合它。您需要在应用中添加非纵向模式的图像。您还需要添加约束,以便没有图像扩展边界。

简单的建议是调试它在特定设备上伸展的原因? 遵循三个步骤 1) 使用背景颜色

2) 对图像视图的约束

3) 使用图像纵横比

    Try this - let IS_OS_8_OR_LATER = 
    Float(UIDevice.currentDevice().systemVersion) >= 8.0

   let IS_IPHONE = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Phone

   let IS_STANDARD_IPHONE_6 = (IS_IPHONE && 
   UIScreen.mainScreen().bounds.size.height == 667.0 && IS_OS_8_OR_LATER && 
    UIScreen.mainScreen().nativeScale == UIScreen.mainScreen().scale)

let IS_ZOOMED_IPHONE_6 = (IS_IPHONE && 
UIScreen.mainScreen().bounds.size.height == 568.0 && IS_OS_8_OR_LATER && 
 UIScreen.mainScreen().nativeScale > 
UIScreen.mainScreen().scale)

let IS_STANDARD_IPHONE_6_PLUS = (IS_IPHONE && 
UIScreen.mainScreen().bounds.size.height == 736.0 )

let IS_ZOOMED_IPHONE_6_PLUS = (IS_IPHONE && 
UIScreen.mainScreen().bounds.size.height == 667.0  && IS_OS_8_OR_LATER && 
UIScreen.mainScreen().nativeScale < UIScreen.mainScreen().scale)

if IS_ZOOMED_IPHONE_6_PLUS 
    //do something

【讨论】:

iPhone 7plus 版本,集合视图单元格左右两侧的额外空间 它的简单问题布局与图像方面问题。只需尝试添加更多约束并使用方面填充和拟合。 更新我的答案请检查 我已经尝试过您的建议,但没有给出不同的结果。因为图片下方的 UILabel 也是重叠的。请记住,我不仅使用图像视图,还使用集合视图单元格 我确定这是自动布局问题。但是如果你相信你已经完成了最后一件事,我建议你是这段代码

以上是关于如何设置动态宽度 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 动态宽度基于里面的项目数吗?

如何使用自动布局以编程方式快速设置旋转时 UICollectionView 的宽度

UICollectionView 动态高度和宽度

以编程方式将 UICollectionViewCell 宽度设置为 UICollectionView 宽度

以编程方式将UICollectionViewCell宽度设置为UICollectionView宽度

uicollectionview 动态高度但固定宽度