创建单一大小的动态 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 的大小类随机忽略

如何在 iOS 中根据 dp(不是点数)设置 UILabel 字体大小,就像只有自动布局的 android

动态改变UILabel的字体大小

UILabel 动态获取字体大小 - swift 3

基于多行 UILabel 自动调整 UIView 的大小