ios - 使 UILabel 很好地适合集合视图单元格
问题描述
我在流布局中有宽度和高度相等的集合视图单元格。它们包含一个 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
如下:
推荐阅读
- python - 如何求解均值的演化
- android - FFmpeg 为 ORIGINAL 和 CONVERTED 文件生成不同数量的帧,即使它们具有相同的持续时间和帧速率
- java - 如何检查两个本地时间是否在同一天?
- mongodb - MongoDb 游标已关闭。db 宕机后不恢复
- selenium-webdriver - 如何使用 selenium python 滚动到页面底部?(使用 find_element_by_xpath())
- git - 在 WSL 上使用 SSH 将代码推送到 Azure DevOps 失败
- docker - Docker:非root用户在使用卷时没有写权限
- python-3.x - Robotframework-selenium-Edgebrowser-“未创建会话-未找到匹配的功能
- c# - 创建内部 WebAPI 2.0 循环
- android - Flutter API 响应