swift - UILabeltext siwft 的自动收缩字体大小
问题描述
我有一个多行 UILabel 文本,它根据文本长度动态扩展。我已经在情节提要中设置了正确的自动布局,如果文本很长,我会变得更大。
但是如果是 2 行,我想将字体大小减小到 24,如果是 3 行文本,我想减小到 20。
如果文本是单行,则字体大小应为 34。
我尝试了最小字体比例 = 20/34 = .58
但没有用。请提出解决方案
解决方案
您可以使用 switch 语句来确定在更改标签文本后达到一定数量的行数时的字体大小。
使用https://stackoverflow.com/a/60993649/12783209中的 actualNumberOfLines() 算法,您可以在必要时重新声明此标签的字体。
func changeFontSizeIfNeeded(on label: inout UILabel){
switch label.actualNumberOfLines{
case 2:
label.font = label.font.withSize(24)
case 3:
label.font = label.font.withSize(20)
default:
//Change this to be the default font size
label.font = label.font.withSize(30)
}
}
并将此扩展添加到您的项目中:
extension UILabel{
func actualNumberOfLines()-> Int {
// You have to call layoutIfNeeded() if you are using autoLayout
self.layoutIfNeeded()
let myText = self.text! as NSString
let rect = CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude)
let labelSize = myText.boundingRect(with: rect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: self.font as Any], context: nil)
return Int(ceil(CGFloat(labelSize.height) / self.font.lineHeight))
}
}
推荐阅读
- android - 在颤动中结合两个不同的firebase集合
- javascript - 让 babel 自动转译
- javascript - 从 api 获取新数据
- javascript - 如何在反应js中传递一个函数来形成输入值?
- haskell - 在用户定义类型和现有类型之间定义已经存在(例如在 Prelude 中)运算符的正确方法是什么?
- scala - 具有案例等级评级的 ALS 训练数据
- python - Pandas 中的线性模型
- python - Python 文件上传更改校验和
- python - 如何从 Ableton Live 控制表面脚本向我的 Arduino 板发送 MIDI 数据
- react-native - 在 React Native 中单击 TextInput 时切换视图