Swift 3 - 调整字体大小以适应宽度,多行

Posted

技术标签:

【中文标题】Swift 3 - 调整字体大小以适应宽度,多行【英文标题】:Swift 3 - Adjust Font Size to Fit Width, Multiple Lines 【发布时间】:2017-07-24 07:41:13 【问题描述】:

我有一个 UILabel,它设置为 42.0 pt 字体,并且标签的宽度是使用基于标签本身以外的因素的自动约束设置的(也就是标签左右两侧的东西决定了标签的宽度)。

我想自动调整字体大小以适应标签的宽度,但如果可以的话,也可以分成两行。类似这样:

我知道你可以调整字体大小以适应标签的宽度,但仅限于行数设置为 1 时。

我将如何做到这一点?

【问题讨论】:

如果将行数设置为 0 会怎样? 文字仍然停留在一行,字体大小没有缩小 【参考方案1】:

有趣的问题。这是我的解决方案:

let labelText = self.mylabel.text //where mylabel is the label
let labelSeperated = self.labelText.components(seperatedBy: " ")
if labelSeperated.count > 1 
    myLabel.lineBreakMode = .byWordWrapping
    myLabel.numberOfLines = 0 
 else 
    myLabel.numberOfLines = 1
    myLabel.adjustsFontSizeToFitWidth = true 

将此代码放在要更改标签的位置。如果有两个或多个数字,则将行号设置为 0,否则仅设置为 1 行。

如果您想调整多行标签的大小,请查看 this 博客文章。

【讨论】:

这个方案唯一的问题是多行文字时字体大小不会改变 @ChrisSchlitt 你看过博文了吗?【参考方案2】:

这会起作用..

为您的标签设置最小比例因子。如图所示。 设置行数 = 2 // 如果需要更多行数,则设置为零 (0) 将 2 行的换行模式设置为“.byTruncatingTail”

斯威夫特 3 为动态文本信息设置行数为零,这将有助于改变文本。

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 2 // 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.5 // It is not required but nice to have a minimum scale factor to fit text into label frame

另外,请勿为标签设置超过 2 行的高度限制。

【讨论】:

我试过了,但是当你将 numberOfLines 设置为 1 以外的任何值时,字体大小不会缩小 请分享您的代码,您已经尝试过,我已经对此进行了测试,并且非常适合您的示例。 使用.byTruncatingTail 很重要,这也是默认值。这个解决方案有一条评论说or .byWrappingWord,那是行不通的。另请参阅***.com/q/44038022/833197。【参考方案3】:

斯威夫特 5

func setFontForLabel(label:UILabel, maxFontSize:CGFloat, minFontSize:CGFloat, maxLines:Int) 

    var numLines: Int = 1
    var textSize: CGSize = CGSize.zero
    var frameSize: CGSize = CGSize.zero
    let font: UIFont = label.font.withSize(maxFontSize)

    frameSize = label.frame.size

    textSize = (label.text! as NSString).size(withAttributes: [NSAttributedString.Key.font: font])

    // Determine number of lines
    while ((textSize.width/CGFloat(numLines)) / (textSize.height * CGFloat(numLines)) > frameSize.width / frameSize.height) && numLines < maxLines 
        numLines += 1
    

    label.font = font
    label.adjustsFontSizeToFitWidth = true
    label.numberOfLines = numLines
    label.minimumScaleFactor = minFontSize/maxFontSize

斯威夫特 3

我查看了paper111 发布的帖子。不幸的是,它在 Obj-C 中,并且 sizeWithFont: ,constrainedToSize: , lineBreakMode: 方法已被弃用。 (- - );

他的回答很好,但仍然没有提供固定的尺寸。我所做的是从UILabel 开始,除了高度之外什么都有(这对大多数人来说可能都是一样的)。

let myFrame = CGRect(x: 0, y:0, width: 200, height: self.view.height)
let myLbl = UILabel(frame: myFrame)
let finalHeight:CGFloat = 300

myLbl.font = UIFont(name: "Chalkduster", size: 16.0)
myLbl.lineBreakMode = .byWordWrapping
myLbl.numberOfLines = 0
myLbl.text = "Imagine your long line of text here"
addSubview(myLbl)
myLbl.sizeToFit()

guard myLbl.frame.height > finalHeight else  return 
var fSize:CGFloat = 16 //start with the default font size
    repeat 
        fSize -= 2
        myLbl.font = UIFont(name: "Chalkduster", size: fSize)
        myLbl.sizeToFit()
     while myLbl.frame.height > finalHeight

您可以看到guard 在不需要时阻止调整大小。此外,多次致电sizeToFit() 并不理想,但我想不出另一种解决方法。我尝试在循环中使用myLbl.font.withSize(fSize),但它不起作用,所以我使用了完整的方法。

希望它对你有用!

【讨论】:

【参考方案4】:

@Krunal 的回答对我有帮助,但是当您的行数未知时它不起作用,所以这是我想出的解决方案。您还可以设置最大和最小字体大小。希望这对某人有帮助!

Swift 2.2 - 抱歉,尚未迁移到 Swift 3

func setFontForLabel(label:UILabel, maxFontSize:CGFloat, minFontSize:CGFloat, maxLines:Int) 

    var numLines: Int = 1
    var textSize: CGSize = CGSizeZero
    var frameSize: CGSize = CGSizeZero
    var font: UIFont = UIFont.systemFontOfSize(maxFontSize)

    frameSize = label.frame.size

    textSize = (label.text! as NSString).sizeWithAttributes([NSFontAttributeName: font])

    // Determine number of lines
    while ((textSize.width/CGFloat(numLines)) / (textSize.height * CGFloat(numLines)) > frameSize.width / frameSize.height) && numLines < maxLines 
        numLines += 1
    

    label.font = font
    label.adjustsFontSizeToFitWidth = true
    label.numberOfLines = numLines
    label.minimumScaleFactor = minFontSize/maxFontSize

【讨论】:

【参考方案5】:

斯威夫特 5

extension UILabel
func adjustsFontSizeToFit(maxFontSize:CGFloat,width:CGFloat,height:CGFloat) 
    self.numberOfLines = 0
    var fontSize:CGFloat = maxFontSize
    if self.sizeThatFits(CGSize(width: width, height: .infinity)).height > height
        while self.sizeThatFits(CGSize(width: width, height: .infinity)).height > height
            fontSize -= 1
            self.font = self.font.withSize(fontSize)
        
    

【讨论】:

以上是关于Swift 3 - 调整字体大小以适应宽度,多行的主要内容,如果未能解决你的问题,请参考以下文章

如何调整字体大小以适应 UILabel 的高度和宽度

调整字体大小以适应边界矩形?

将字体大小调整为 uilabel 宽度

调整UILabel的大小以适应Word Wrap

自动调整 UILabel 文本大小以适应 UILabel 宽度

更改字体大小以适应可变宽度容器