Swift UICollectionView水平滚动单元的标签宽度根据标签内容的长度动态变化

时间:2019-06-17 09:48:16

标签: ios swift

我正在尝试使用UICollectionView创建cell label 水平滚动(如顶部菜单的单行)。在这里,我需要实现标签内容的不同长度,因此基于不同长度的单元格标签应自动调整其宽度。我在设计中使用情节提要。

在我的代码下方

extension CameraViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.items.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Constants.reuseID, for: indexPath) as! cameraModeCollectionViewCell
        cell.cameraMode.text = self.items[indexPath.item]
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("You selected cell #\(indexPath.item)!")
    }

   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {        
        return UIEdgeInsetsMake(0, 40, 0, 40)
   }
}

Current output Iam getting

2 个答案:

答案 0 :(得分:4)

步骤1:找到每个单元格中必须放置的文本的宽度。可以使用以下功能找到 string.size(withAttributes:[.font: UIFont.systemFont(ofSize: 14.0)]).width

使用此功能,我们可以找到运行时动态文本的宽度。

第2步:使用在步骤1中找到的宽度设置每个单元格的大小。使用下面的委托设置每个单元格的大小 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

结合步骤1和2,我们可以获得一个集合视图,该视图的单元格宽度与放置在其中的文本宽度相同。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let text = self.items[indexPath.row] // getting text of each index
    let cellWidth = text.size(withAttributes:[.font: UIFont.systemFont(ofSize: 14.0)]).width + 10.0 // getting width of each text + extra margin of 10 
    return CGSize(width: cellWidth, height: 40.0) // height as per your requirement
}

答案 1 :(得分:2)

实施UICollectionViewDelegateFlowLayout's方法collectionView(_:layout:sizeForItemAt),并根据您要填充{{的width的{​​{1}}计算collectionViewCell的{​​{1}} 1}}。

width

在上面的代码中,我使用text作为label的来源。 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let text = self.items[indexPath.row] let cellWidth = text.size(withAttributes:[.font: UIFont.systemFont(ofSize: 14.0)]).width + 10.0 return CGSize(width: cellWidth, height: collectionView.bounds.height) } 是添加到单元格的额外self.items[indexPath.row]

如果text 10.0padding,请在使用前将items的值array设置。