创建单一大小的动态UILabel字体

时间:2015-10-16 00:15:42

标签: objective-c string swift dynamic font-size

我们都知道如何创建动态UILabel字体(单行) -

 lbl.adjustsFontSizeToFitWidth = true
 lbl.numberOfLines = 1
 lbl.minimumScaleFactor = 0.1
 lbl.baselineAdjustment = UIBaselineAdjustment.AlignCenters
 lbl.textAlignment  = NSTextAlignment.Center

问题在于它为每个给定的字符串提供了不同的结果。因此,例如,如果我有一个字符串"Hello""Hello World",计算出的字体大小将会不同。我需要为所有字符串创建一个单一大小的动态字体。

我的项目示例:

MyProject

内置相机效果的iPhone 6示例(正如您可以看到所有UILabels字体大小匹配):

Apple

我的想法是什么?

基本上我知道我拥有的最大字符串是什么。所以我想以某种方式(以有效的方式)计算给定 CGSIze 最大字符串字体大小。所以它将始终保持在一定的范围内。 有任何建议吗?

1 个答案:

答案 0 :(得分: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会告诉你它适合缩小了多少;但是这个功能被打破了,唉,所以我可以建议你使用它。)