ios - 在 UILabel 中拟合文本 - Swift
问题描述
我正在努力将文本放入 UILabel。我希望 UILabel 的宽度保持不变,但我希望文本的字体大小发生变化,以便所有文本都能够适合标签。我基本上是在创建一个带有文本项的菜单栏:今天、明天、本周、下周。这是我的标签设置:
class MenuCell: BaseCell {
let dateLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.backgroundColor = UIColor(red: 247/255, green: 199/255, blue: 199/255, alpha: 1)
label.sizeToFit()
label.textAlignment = .center
label.adjustsFontForContentSizeCategory = true
label.allowsDefaultTighteningForTruncation = true
label.numberOfLines = 2
label.lineBreakMode = NSLineBreakMode.byTruncatingTail
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 10/UIFont.labelFontSize
return label
}()
我通过这个函数有特定的宽度高度大小:
func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: frame.width / 4, height: frame.height)
}
我设置了这些单元格:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) as! MenuCell
cell.dateLabel.text = labelnames[indexPath.item]
cell.backgroundColor = UIColor(red: 247/255, green: 199/255, blue: 199/255, alpha: 1)
return cell
}
最终,要将单元格添加到视图中,我这样做:
override func setupViews(){
super.setupViews()
addSubview(dateLabel)
dateLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
}
我将整个视图放在导航栏下方的另一个视图控制器文件中:
lazy var menuBar: MenuBar = {
let mb = MenuBar()
mb.homeController = self
return mb
}()
private func setupMenuBar() {
view.addSubview(menuBar)
view.addConstraintsWithFormat(format: "H:|[v0]|", views: menuBar)
view.addConstraintsWithFormat(format: "V:|-64-[v0(50)]", views: menuBar)
}
但由于某种原因,我拥有的文本不会更改字体大小以适应 UIlabel 单元格。尝试适合的文本示例:
let labelnames = ["Todayyyyyyyyyy","Tomorrow", "This Week", "Next Week"]
“Todayyyyyyyyyyy”不会更改字体大小以完全适合。我调整了哪些其他属性来解决我的问题?
解决方案
选项#1——自动调整
将您的字体大小设置为大并根据需要将其缩小,如下所示:
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.01
您只需要将初始大小设置为巨大。它只会缩小,不会放大。
这里的缺点是,如果你做一些非常大的事情,比如:
label.font = UIFont.systemFont(ofSize: 500)
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.0001
默认情况下,标签的高度将基于 500。
选项 #2 - 手动调整以获得更紧密的配合
func updateLabel(_ s: String, label: UILabel) {
var size = 222 as CGFloat
repeat {
let textSize = s.size(withAttributes:[.font: UIFont.systemFont(ofSize:size)])
if textSize.width <= label.frame.width {
break
}
size -= 0.10
} while (size > 4)
label.font = UIFont.systemFont(ofSize: size)
label.text = s
}
快速示例:视频和源代码。上部标签使用选项#1,底部标签使用选项#2。
您可以看到选项 #2 比系统管理的方式效果更好。它可能也更占用 CPU 资源,但如果您只为每个标签执行一次,这可能并不重要。
可能是您的标签框架不是您认为的大小,因为您只设置了一个topAnchor。您是否还设置其他人或做宽度限制或其他什么?
如果标签应该填充单元格,您可以执行以下操作:
override func setupViews(){
super.setupViews()
addSubview(dateLabel)
dateLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
dateLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
dateLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
dateLabel.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
}
另一个建议是在 Xcode 中运行应用程序,然后使用视图调试器工具——点击这个东西:
这将在 Xcode 中显示屏幕的分解视图,以及所有视图的框架。检查标签是否真的是您认为的尺寸。
推荐阅读
- c - 计算和打印矩阵的对角线之和
- javascript - 如何在 Angular 中使用 addEventListener 和 postMessage?
- php - 如何将日期、时间和值从单选按钮放入数据库
- c# - 逐个像素地动态绘制和显示,有一些延迟
- npm - 如何从 Nexus oss 代理获取依赖于 github 项目的 npm 包
- django - Django 测试 - 发送包含整数的数组数组
- android - 在 android 中使用改造登录
- json - 我如何在 nunjuncks 中乘以数据?
- swift - 为什么不能在swift中将可变参数标记为inout?
- vue.js - Vue Js 2 / Vue-CLI 3 / 托管时显示空白页