动态UICollectionView单元格框架

时间:2018-07-27 04:04:39

标签: ios swift uicollectionview uicollectionviewcell

现在,我面临一个问题。

我设法将单元格的内容视图包装到其标签上,但是有些间距不适合设计。单元格之间有一些可用空间

这是我的代码

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 4
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let hastag = Hastag.fetchHastag()[indexPath.row]

    let approximateWidth = view.frame.width - 20
    let size = CGSize(width: approximateWidth, height: 28)
    let attribute = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12)]

    let estimatedFrame = NSString(string: hastag.hastag).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attribute, context: nil)

    return CGSize(width: estimatedFrame.width + 20, height: 26)

}

下面是结果

enter image description here

这就是我要实现的目标,将是这样的

enter image description here

更新

这是我的收集视图数据源和委托的完整代码。 Hastag.hastag是字符串类型

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "hastagCell", for: indexPath) as! HastagCollectionViewCell

    cell.hastag = Hastag.fetchHastag()[indexPath.row]

    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 4
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let hastag = Hastag.fetchHastag()[indexPath.row]

    let approximateWidth = view.frame.width - 20
    let size = CGSize(width: approximateWidth, height: 28)
    let attribute = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12)]

    let estimatedFrame = NSString(string: hastag.hastag).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attribute, context: nil)

    return CGSize(width: estimatedFrame.width + 16, height: 26)

}

3 个答案:

答案 0 :(得分:0)

您可以使用AlignedCollectionViewFlowLayout,它不是一个库,而只是一个文件。只需将此文件添加到您的项目中,然后从UICollectionView xib中将流布局设置为AlignedCollectionViewFlowLayout。这是非常容易使用。请检查以下链接。

this what I'm talking about

答案 1 :(得分:0)

您可以使用size(withAttributes:)的{​​{1}}函数为您提供具有特定字体和大小的字符串NSString

假设CGSizeHastag.hastag,我认为以下方法应该有效:

String

请注意,您的extension YourViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let hastag = Hastag.fetchHastag()[indexPath.row] let title = hastag.hastag as NSString let titleSize = title.size(withAttributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12)]) return CGSize(width: titleSize.width + 20, height: 26) } } 必须实现ViewController协议,并且必须将UICollectionViewDelegateFlowLayout设置为{{1}的ViewController }。

希望有帮助。

答案 2 :(得分:0)

经过几次尝试,我最终放弃了自定义单元格大小,而是使用了TagListView