Home » Swift » Swift – Adjusting fontSize to fit the width of the layout (programmatically)

Swift – Adjusting fontSize to fit the width of the layout (programmatically)

Posted by: admin November 30, 2017 Leave a comment

Questions:

I’ve been looking for something to dynamically adjust my fontSize to fit the width of my layout box. But all the answers I can find, is either to use this:

label.adjustsFontSizeToFitWidth = true

Which does work. But only if I don’t have setTranslatesAutoresizingMaskIntoConstraints set to false.

Please note that I don’t use storyboards. So to have full control over my other constraints I need this line:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

So how can I adjust the font size to fit the width without using storyboard and when I can’t use adjustsFontSizeToFitWidth.

After I figure out how to adjust the font size to fit the width. I also need to adjust the height of the layout box to fit the font size. There seems to be documentation on that though, but if you happen to know the answer of this as well, it would be greatly appreciated.

Thanks in advance

Answers:

Try the following commands for your label:

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2

And try to change the lines of the label to 0 and 1 (check both cases):

label.numberOfLines = 0 // or 1

Questions:
Answers:

I think this will help you

Objective C

[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]];
lb.adjustsFontSizeToFitWidth = YES;

Swift 3.0

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

Questions:
Answers:

I just did that you needed , Works perfectly ! (Programmatically ONLY) –
We are setting large font size to the label , in order to re-scale it to the perfect font size.

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

If you are using AutoLayout, implement this code in viewDidLayoutSubviews (after the layout has been laid out).

Yours, Roi

Questions:
Answers:

I don’t know if this will completely answer your question, but you can use this extension to calculate your own font sizes to fit.

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
   }
}

Questions:
Answers:

Here’s a hack solution:

var size: CGFloat = 20

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

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

    }

Leave a Reply

Your email address will not be published. Required fields are marked *