objective-c - 创建单一尺寸的动态 UILabel 字体

标签 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最大字符串字体大小。所以它将始终保持在界限之内。 有什么建议吗?

最佳答案

你说的是:

lbl.minimumScaleFactor = 0.1

这行意思是,“嘿,iOS,如果你想缩小字体,那就缩小吧。”如果你不想这样,那就别说。

相反,选择一个字体大小并坚持使用。什么尺寸?嗯,NSString 能够告诉您给定字体/大小的绘制字符串的大小。因此,只需取出最长的绳子并循环选择不同的尺寸,直到找到适合所需空间的绳子。

将您自己的值(value)观插入其中:

    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 会告诉您它缩小了多少以适合;但是该功能已损坏,唉,所以我可以不建议您使用它。)

关于objective-c - 创建单一尺寸的动态 UILabel 字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33160574/

相关文章:

objective-c - 基于 View 的 NSTableView 中的复选框问题

python - 如何从预先分割的字符串中获取列表?

javascript - 使用javascript删除部分字符串

python - 如何按另一个列表中出现的字符拆分字符串?

iphone - 无法让 UIPageViewController 工作

iphone - 创建自定义 UIActivityIndi​​catorView

iOS 谷歌云消息传递负载

swift - 来自不同类的 IOS Swift 调用函数得到 nil

ios - 谷歌地理编码不断返回不同地方的市中心位置

objective-c - Objective-C 与 Swift 自定义初始化器