如何在 Swift 中使用宽度约束将 Xib 加载到 CollectionView?

Posted

技术标签:

【中文标题】如何在 Swift 中使用宽度约束将 Xib 加载到 CollectionView?【英文标题】:How to load Xib to CollectionView using width constraint in Swift? 【发布时间】:2020-11-18 09:39:00 【问题描述】:

我有这样的collectionView

我正在向这样的单元格调用不同的 3 个 xib 文件

collectionView.register(UINib(nibName: "OfficialVehicleHeader", bundle: nil), forCellWithReuseIdentifier: "OfficialVehicleHeaderCell")
collectionView.register(UINib(nibName: "OfficialVehicleMedium", bundle: nil), forCellWithReuseIdentifier: "OfficialVehicleMediumCell")
collectionView.register(UINib(nibName: "OfficialVehicleBottom", bundle: nil), forCellWithReuseIdentifier: "OfficialVehicleBottomCell")

我的collectionView布局代码

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
collectionView.setCollectionViewLayout(layout, animated: true)
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

在 xib 文件中,我设置了约束(前导、尾随、底部、顶部为 0)以及高度约束。高度运行得很好没问题,但我不想设置宽度限制。因为屏幕不同

我哪里弄错了?

【问题讨论】:

【参考方案1】:

您必须设置前导和尾随它将根据设备宽度设置宽度。但不要忘记让您的集合视图约束可调整大小。

这是我的示例代码:

collectionView.translatesAutoresizingMaskIntoConstraints = false
    collectionView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    collectionView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    collectionView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    collectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 140).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true

布局设置:

layout.itemSize = CGSize(width: self.view.frame.width - 10, height: self.view.frame.height / 3)

可调整大小的单元格约束:

cell.widthAnchor.constraint(equalTo: widthAnchor, constant: 0).isActive = true
        cell.heightAnchor.constraint(equalTo: heightAnchor, constant: 0).isActive = true
        cell.leftAnchor.constraint(equalTo: leftAnchor, constant: 0).isActive = true
        cell.rightAnchor.constraint(equalTo: rightAnchor, constant: 0).isActive = true

【讨论】:

【参考方案2】:

我解决了这个问题。我需要设置宽度约束,但我不想设置。我这样解决

    转到xib文件并设置宽度限制

    转到尺寸检查器并选择您创建的宽度约束

    设置标识符,例如“myConstraint”

    打开您的单元格文件并定义 IBOutlet

    for constraint in self.containerView.constraints 
      if constraint.identifier == "myConstraint" 
        constraint.constant = UIScreen.main.bounds.size.width * 0.70
      
    
    containerView.layoutIfNeeded()
    

我添加了我提到的图像

【讨论】:

以上是关于如何在 Swift 中使用宽度约束将 Xib 加载到 CollectionView?的主要内容,如果未能解决你的问题,请参考以下文章

将 xib 文件中的视图添加到 UITableViewCell 添加约束

Swift 包中的 XIB 文件 - 忽略约束

在 Swift 中以编程方式设置 XIB 文件的约束

使用自动布局调整 xib 元素的宽度

尝试加载 xib 文件时无法同时满足约束

如何在swift中按下按钮从另一个xib文件加载另一个xib文件