Swiftpack.co - Package - tbaranes/FittableFontLabel

FittableFontLabel

Travis Language Platform CocoaPods Carthage compatible

UILabel can shrink font size as follows:

label.minimumScaleFactor = 0.3
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 1

But it won't always work as expected:

  • Doesn't fit the label height
  • Big top / bottom margins when the maxFontSize is huge
  • Not really customisable
  • ...

That's why FittableFontLabel exists:

  • Make the text fit the label size: width and height if multilines, width only if single lines
  • Works with one or several lines
  • Supports attributed string (custom line spacing...)
  • Customize maxFontSize without using default label font size
  • Auto-layout compliant
  • UILabel extension if we want to use UILabel
  • Customisable from xibs / storyboards when using the UILabel's subclass FittableFontLabel
  • ...

Multilines UILabel:

Multilines UILabel with attributed string (lines spacing):

Single line UILabel:

Usage

let aFittableFontLabel = FittableFontLabel(frame: CGRect(x: 0, y: 0, width: 300, height: 100))
aFittableFontLabel.autoFittableFont = true
aFittableFontLabel.lineBreakMode = .ByWordWrapping
aFittableFontLabel.numberOfLines = 0 // or 1...
aFittableFontLabel.text = "?"
// Change the text, it will always fit the label frame!

Check the sample project for advanced usage.

Note: The label lineBreakMode must be set to NSLineBreakByWordWrapping in order to work.

Installation

  • iOS 8.0+

CocoaPods

Add pod FittableFontLabel to your Podfile.

Carthage

Add github "tbaranes/FittableFontLabel" to your Cartfile.

Swift Package Manager

FittableFontLabel is available on SPM. Just add the following to your Package file:

import PackageDescription

let package = Package(
    dependencies: [
        .Package(url: "https://github.com/tbaranes/FittableFontLabel.git", majorVersion: 1)
    ]
)

Manual Installation

Just drag the Source/*.swift files into your project.

UILabel extension

func fontSizeToFit(maxFontSize: CGFloat = 100, 
					  minFontScale: CGFloat = 0.1,
					  rectSize: CGSize? = nil)

Adjust the font size to make the current text fit the label frame.

  • maxFontSize: the biggest font size to use during drawing. The default value is 100
  • minFontScale: the scale factor that determines the smallest font size to use during drawing. The default value is 0.1
  • rectSize: the size where the text must fit. The default value is the label bounds
func fontSizeThatFits(
        text string: String, 
        maxFontSize: CGFloat = 100, 
        minFontScale: CGFloat = 0.1,
        rectSize: CGSize? = nil) -> CGFloat

Returns the font size that can make the text parameter fit the label frame.

  • text: the text that needs to fit in the label
  • maxFontSize: the biggest font size that can be returned. The default value is 100
  • minFontScale: the scale factor that determines the smallest font size that can be returned. The default value is 0.1
  • rectSize: the size where the text must fit. The default value is the label bounds

FittableFontLabel

An UILabel subclass allowing you to automatize the process of adjusting the font size.

@IBInspectable public var autoAdjustFontSize: Bool = true

If true, the font size will be adjusted each time that the text or the frame change.

@IBInspectable public var maxFontSize = CGFloat.NaN

The biggest font size to use during drawing. The default value is the current font size

@IBInspectable public var minFontScale = CGFloat.NaN

The scale factor that determines the smallest font size to use during drawing. The default value is 0.1

@IBInspectable public var leftInset: CGFloat = 0
@IBInspectable public var rightInset: CGFloat = 0
@IBInspectable public var topInset: CGFloat = 0
@IBInspectable public var bottomInset: CGFloat = 0

These four properties allow you to set a marge in your label. That will change the rect where the font must fit. The default value is 0.

Contribution

  • If you found a bug, open an issue
  • If you have a feature request, open an issue
  • If you want to contribute, submit a pull request

Licence

FittableFontLabel is available under the MIT license. See the LICENSE file for more info.

Github

link
Stars: 58
Help us keep the lights on

Dependencies

Used By

Total: 0

Releases

3.0.0 - Sep 18, 2018

Support for Swift 4.2 and Xcode 10

2.0.0 - Nov 10, 2017

Xcode 9.1 and Swift 4 support

1.4.0 - Sep 11, 2016

API breaking changes

  • Swift 3 compatibility

Bugfixes

  • Improved issue with long strings in small labels getting truncated

1.3.0 - Aug 15, 2016

Enhancements

  • Improving performance by using binary search instead of simple loop. That may prevent xcode freezing

Bugfixes

  • Fixed fontSizeThatFits when used with empty strings

1.2.0 - Aug 1, 2016

Enhancements

  • Improvign default value of fontSizeToFit in UILabelExtension. Default value is now explicitly 100
  • Added fontSizeThatFits method in UILabelExtension that returns a font size of the given text which can just fit the given CGSize.