Ios 使UILabel非常适合集合视图单元格

Ios 使UILabel非常适合集合视图单元格,ios,swift,uicollectionview,label,Ios,Swift,Uicollectionview,Label,在流布局中,我有宽度和高度相等的集合视图单元。它们包含一个UILabel,其numberOfLines属性设置为0。标签的约束条件包括: 该单元为圆形: cell.layer.cornerRadius = cell.frame.width / 2 cell.clipsToBounds = true 我根据标签的文本大小增加每个单元格的大小。但是,它的宽度和高度不能大于150。以下是我如何确定每个单元格的大小: private func estimatedFrameForText(text

在流布局中,我有宽度和高度相等的集合视图单元。它们包含一个UILabel,其
numberOfLines
属性设置为
0
。标签的约束条件包括:

该单元为圆形:

 cell.layer.cornerRadius = cell.frame.width / 2
 cell.clipsToBounds = true
我根据标签的文本大小增加每个单元格的大小。但是,它的宽度和高度不能大于
150
。以下是我如何确定每个单元格的大小:

private func estimatedFrameForText(text: String) -> CGRect {
    let size = CGSize(width: 100, height: 1000)
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)

    return NSString(string: text).boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17)], context: nil)
}

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


    let hashLabelText = textArray[indexPath.item]
    let textSize = estimatedFrameForText(text: hashLabelText)


    let width = min(150, textSize.width + 20)
    let height = width

    return CGSize(width: width, height: height)
}
通过此操作,我得到以下结果(我显示的是单元格宽度和高度等于
150
)的部分:

如您所见,当单元格达到其最大可能大小且标签的文本继续增加时,在某个点上,文本脱离单元格的可见部分。我理解为什么会发生这种情况(布局调试器清楚地显示了这一点),但是我还没有找到解决问题的方法

我想要的是,无论单元格大小如何,标签的边缘都保持可见。如果单元格达到其最大大小,文本的尾部可能会被截断,但文本会继续增加


我试图增加标签和单元格边界之间的间距,但这会影响最小单元格中文本的外观。我还尝试更改标签的最小字体比例,但同样没有成功

您必须使用
UIEdgeInsets
为此,请为UILabel创建一个类:

import UIKit

class UILabelDraw: UILabel {
    override func drawText(in rect: CGRect) {
        let insets: UIEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }
}
将此类用作标签类,如下所示:

UIEdgeInsets
的输出如下:


欢迎光临,我很乐意帮助您。