Swift - 调整fontSize以适应布局的宽度(以编程方式)

时间:2015-02-26 03:33:58

标签: ios xcode swift fonts

我一直在寻找动态调整fontSize以适应布局框宽度的内容。但我能找到的所有答案要么是使用它:

label.adjustsFontSizeToFitWidth = true

哪个确实有效。但是,只有我没有setTranslatesAutoresizingMaskIntoConstraints设置为false

请注意,我不使用故事板。因此,为了完全控制我的其他约束,我需要这一行:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

那么如何在不使用故事板的情况下调整字体大小以适应宽度,以及何时我无法使用adjustsFontSizeToFitWidth

在我弄清楚如何调整字体大小以适应宽度之后。我还需要调整布局框的高度以适应字体大小。虽然似乎有关于这方面的文件,但是如果你碰巧知道这个问题的答案,那将非常感激。

提前致谢

7 个答案:

答案 0 :(得分:41)

请为您的标签尝试以下命令:

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2

并尝试将标签的行更改为0和1(检查两种情况):

label.numberOfLines = 0 // or 1

答案 1 :(得分:13)

MinimumScaleFactor范围是0到1.因此我们根据字体大小设置[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]]; lb.adjustsFontSizeToFitWidth = YES;,如下所示

目标C

lb.minimumScaleFactor = 10/UIFont.labelFontSize lb.adjustsFontSizeToFitWidth = true

Swift 3.0

{{1}}

答案 2 :(得分:3)

我不知道这是否会完全回答您的问题,但您可以使用此扩展程序来计算自己适合的字体大小。

extension String {
   func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat {
       let constraintSize = CGSize(width: width, height: .max)
       let boundingBox = self.boundingRectWithSize(constraintSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

       return boundingBox.height
   }

   func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat {
       let constrainedSize = CGSize(width: .max, height: height)
       let boundingBox = self.boundingRectWithSize(constrainedSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

       return boundingBox.width
   }
}

答案 3 :(得分:2)

我只是做了你需要的,完美的工作! (仅限编程) - 我们为标签设置了较大的字体大小,以便将其重新缩放到完美的字体大小。

self.label.font = UIFont(name: "Heiti TC", size: 60)
self.label.numberOfLines = 0
self.label.minimumScaleFactor = 0.1
self.label.baselineAdjustment = .alignCenters
self.label.textAlignment  = .center

如果您使用的是AutoLayout,请在viewDidLayoutSubviews中实施此代码(布局布局后)。

你的,Roi

答案 4 :(得分:1)

我在UITableViewCell中使用UILabel时遇到了类似的问题,并且我的单元格也在动态调整其高度(如果您想了解更多有关动态单元格高度的信息,请参考此:https://www.raywenderlich.com/129059/self-sizing-table-view-cells

无论我为最小的字体比例做了什么,它都没有用。事实证明,要使此功能正常工作,还必须将“换行”属性设置为“截尾”或“中间”或“头”。如果您有自动换行或自动换行,它将不会动态缩小UILabel字体(我创建了一个自定义字体,称为:Title 2)。

希望这可以帮助其他人找出答案。

这是我的UILabel属性的屏幕截图:

enter image description here

答案 5 :(得分:0)

这是一个黑客解决方案:

var size: CGFloat = 20

    while titleLabel.frame.width > containerView.frame.width {

        titleLabel.font = UIFont.systemFont(ofSize: size)
        titleLabel.sizeToFit()
        size -= 1

    }

答案 6 :(得分:0)

上面的Swift 4转换:

extension String
{
    func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat
    {
        let constraintSize = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

        return boundingBox.height
    }

    func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat
    {
        let constrainedSize = CGSize(width: .greatestFiniteMagnitude, height: height)
        let boundingBox = self.boundingRect(with: constrainedSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

        return boundingBox.width
    }
}