2015-10-16 80 views
0

我们都知道如何创建动态的UILabel字体(单线) -创建单一尺寸动态的UILabel字体

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

的问题是,它给每个给定的字符串不同的结果。因此,例如,如果我有一个字符串"Hello""Hello World",则计算的字体大小将会不同。我需要为所有字符串创建具有单一大小的动态字体。从我的项目

示例:从iPhone 6

MyProject

例内置摄像头的效果(正如你可以看到所有的UILabels字体大小一致):

Apple

什么我在想什么?

基本上我知道什么是我会有的最大的字符串。所以我想不知怎么计算(在一个有效的方式)字体大小最大的字符串在给定的CGSIze。所以它会一直保持在界限内。 有什么建议吗?

回答

1

你是第一个说:“嘿,iOS的,如果你觉得像缩小字体,继续前进,它收缩”

lbl.minimumScaleFactor = 0.1 

那行意味着,如果你不想那样,那就不要那么说。

取而代之的是,选择一个字体大小,并坚持下去。什么尺寸?那么,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会告诉你多少缩小到适合;但该功能是坏的,唉,所以我不能建议你使用它。)

+0

嘿马特,谢谢你的评论。我知道这不是正确的使用方式*如果*您正在寻找相同的字体大小,显然。我只是把它放在那里,所以人们不会建议这种方法。基本上我需要做什么(以一种有效的方式)。使用框架大小(UILabel框架)和给定的字符串(包括字体名称) - >获取所需的字体大小 –

+0

我已经回答了。只需做一个快速循环,比如说10种不同的尺寸。没有效率低下。它不会需要一毫秒。相信我。我已经完成了数十亿次。 – matt

+0

是的。那是我打算做的,只是想尝试获得更好的结果。现在我们有iPhone 4到iPad视网膜 - >巨大的差异。即时通讯使用autoLayout来设置我的视图,它都是相对于屏幕框架大小。因此,对于更大的屏幕,它可能会运行10次以上 –