创建单一大小的动态 UILabel 字体
Posted
技术标签:
【中文标题】创建单一大小的动态 UILabel 字体【英文标题】:Create single size dynamic UILabel font 【发布时间】:2016-01-14 14:55:35 【问题描述】:我们都知道如何创建动态 UILabel 字体(单行)-
lbl.adjustsFontSizeToFitWidth = true
lbl.numberOfLines = 1
lbl.minimumScaleFactor = 0.1
lbl.baselineAdjustment = UIBaselineAdjustment.AlignCenters
lbl.textAlignment = NSTextAlignment.Center
问题在于它对每个给定的字符串给出不同的结果。因此,例如,如果我有一个字符串 "Hello"
和 "Hello World"
计算的字体大小将不同。我需要为所有字符串创建具有单一大小的动态字体。
我的项目示例:
iPhone 6 内置相机效果示例(您可以看到所有 UILabel 字体大小匹配):
我在想什么?
基本上我知道我将拥有的最大字符串是什么。所以我想以某种方式计算(以一种有效的方式)给定 CGSIze 中 最大字符串 的 字体大小 是多少。所以它会一直保持在界限内。 有什么建议吗?
【问题讨论】:
【参考方案1】:你就是这样说的:
lbl.minimumScaleFactor = 0.1
那行意思是,“嘿,ios,如果你想缩小字体,就缩小吧。”如果你不想那样,就不要那样说。
相反,选择一个字体大小并坚持下去。什么尺寸?好吧,NSString 有能力告诉你一个给定字体/大小的绘制字符串的大小。因此,只需使用最长的字符串并循环使用不同的大小,直到找到适合所需空间的字符串。
将您自己的价值观插入其中:
func fontSizeToFit(s:String, fontName:String, intoWidth w:CGFloat) -> CGFloat?
let desiredMaxWidth = w
for i in (8...20).reverse()
let d = [NSFontAttributeName:UIFont(name:fontName, size:CGFloat(i))!]
let sz = (s as NSString).sizeWithAttributes(d)
if sz.width <= desiredMaxWidth
return(CGFloat(i))
return nil
print(fontSizeToFit("Transferation", fontName:"GillSans", intoWidth:50)) // 9.0
(曾经有一个优雅的字符串绘制功能,你可以让字体缩小和 NSString 会告诉你它缩小到适合的程度;但是这个功能被破坏了,唉,所以我可以'不建议你使用它。)
【讨论】:
嗨,马特,谢谢您的评论。我知道这不是使用它的正确方法 IF 您显然正在寻找相同的字体大小。我只是把它放在那里,所以人们不会建议这种方法。基本上我需要做的(以一种有效的方式)。使用框架大小(UILabel 框架)和给定的字符串(包括字体名称)-> 返回所需的字体大小 我已经回答过了。只需快速循环一下,比如 10 种不同的尺寸。没有什么低效的。它不会花费一毫秒。相信我。我已经做了无数次了。 是的。那就是我打算做的,只是想尝试获得更好的结果。现在我们有 iPhone 4 到 iPad 视网膜 -> 巨大的差异。我使用 autoLayout 来设置我的视图,这一切都与屏幕框架大小有关。所以对于更大的屏幕,它可能会运行 10 次以上 尝试让算法更智能而不是寻找不同的方式会更聪明吗? 添加了实际代码。相信我,这根本不需要时间。您正在浪费自己的时间过早地进行优化。以上是关于创建单一大小的动态 UILabel 字体的主要内容,如果未能解决你的问题,请参考以下文章
字体更改时自动uiLabel和uiTableViewCell调整大小的iphone代码?
UITableView 中 UILabel 的大小类随机忽略