Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift 3-调整字体大小以适应宽度,多行_Ios_Swift_Swift3_Uilabel_Font Size - Fatal编程技术网

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

Ios Swift 3-调整字体大小以适应宽度,多行,ios,swift,swift3,uilabel,font-size,Ios,Swift,Swift3,Uilabel,Font Size,我有一个UILabel,它被设置为42.0 pt字体,标签的宽度是根据标签本身以外的因素使用自动约束设置的(也就是标签左右的东西决定标签的宽度) 我想自动调整字体大小,以适应标签的宽度,但也打破了两行时,它可以。与此类似: 我知道你可以调整字体大小以适应标签的宽度,但只有当行数设置为1时 我该如何做到这一点?有趣的问题。以下是我的解决方案: let labelText = self.mylabel.text //where mylabel is the label let labelSeper

我有一个UILabel,它被设置为42.0 pt字体,标签的宽度是根据标签本身以外的因素使用自动约束设置的(也就是标签左右的东西决定标签的宽度)

我想自动调整字体大小,以适应标签的宽度,但也打破了两行时,它可以。与此类似:

我知道你可以调整字体大小以适应标签的宽度,但只有当行数设置为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行

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

这将起作用

  • 为标签设置最小比例因子。如图所示
  • 如果需要更多的行数,请将行数设置为2//或零(0)
  • 将两行的换行模式设置为“.ByTruncingTail”
Swift 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行的高度限制。

Swift 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
}
您可以看到,如果不需要,有一个
保护
阻止调整大小。另外,多次调用
sizeToFit()
并不理想,但我想不出其他解决方法。我尝试在循环中使用
myLbl.font.withSize(fSize)
,但它不起作用,所以我改用full方法


希望它对你有用

@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
}
func setFontForLabel(标签:UILabel,maxFontSize:CGFloat,minFontSize:CGFloat,maxLines:Int){
变量numLines:Int=1
var textSize:CGSize=CGSizeZero
变量frameSize:CGSize=CGSizeZero
var font:UIFont=UIFont.systemFontOfSize(maxFontSize)
frameSize=label.frame.size
textSize=(label.text!作为NSString)。SizeWithatAttributes([NSFontAttributeName:font])
//确定行数
而((textSize.width/CGFloat(numLines))/(textSize.height*CGFloat(numLines))>frameSize.width/frameSize.height)和&numLines
Swift 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)
        }
    }
}

}

如果将行数设置为0,会发生什么情况?文本仍保留在一行上,字体大小不会缩小我尝试过此操作,但当您将numberOfLines设置为除1之外的任何值时,字体大小不会缩小请与我分享您尝试过的代码,我已经对此进行了测试,并且很好地处理了您的示例。使用
。ByTruncingTail
是很重要的,这也是默认设置。此解决方案的注释为
或.byWrappingWord
,这将不起作用。另请参见。此解决方案的唯一问题是,当有多行字符时,字体大小不会改变text@ChrisSchlitt你看过这篇博文了吗?
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)
        }
    }
}