         let transitionColor = color.interpolate(with: selectedColor,
                                                 percent: selectionState.rawValue)
         label.textColor = transitionColor
+        
+        // Because we can't animate nicely between fonts 😩
+        // Cross dissolve on 'end' states between font properties.
+        if let selectedFont = self.selectedFont {
+            if selectionState == .selected && label.font != selectedFont {
+                UIView.transition(with: self, duration: 0.25, options: .transitionCrossDissolve, animations: {
+                    self.label.font = self.selectedFont
+                }, completion: nil)
+            } else if selectionState != .selected && label.font == selectedFont {
+                UIView.transition(with: self, duration: 0.25, options: .transitionCrossDissolve, animations: {
+                    self.label.font = self.font
+                }, completion: nil)
+            }
+        }
     }
 }
 
-// MARK: - Label manipulation
-public extension TMLabelBarButton {
+private extension TMLabelBarButton {
     
-    public var text: String? {
-        set {
-            label.text = newValue
-        } get {
-            return label.text
+    /// Calculates an intrinsic content size based on font properties.
+    ///
+    /// Make the intrinsic size a calculated size based off a
+    /// string value and font that requires the biggest size from `.font` and `.selectedFont`.
+    ///
+    /// - Parameter string: Value used for calculation.
+    private func calculateFontIntrinsicContentSize(for string: String?) {
+        guard let value = string else {
+            return
         }
+        let string = value as NSString
+        let font = self.font
+        let selectedFont = self.selectedFont ?? self.font
+        
+        let fontRect = string.boundingRect(with: .zero, options: .usesFontLeading, attributes: [.font: font], context: nil)
+        let selectedFontRect = string.boundingRect(with: .zero, options: .usesFontLeading, attributes: [.font: selectedFont], context: nil)
+        
+        var largestWidth = max(selectedFontRect.size.width, fontRect.size.width)
+        var largestHeight = max(selectedFontRect.size.height, fontRect.size.height)
+        
+        largestWidth += contentInset.left + contentInset.right
+        largestHeight += contentInset.top + contentInset.bottom
+        
+        self.fontIntrinsicContentSize = CGSize(width: largestWidth, height: largestHeight)
+        invalidateIntrinsicContentSize()
     }
 }

    
    // MARK: Properties
    
    private let label = UILabel()
    
    public var color: UIColor = .black {
        didSet {
            if !isSelected {


import UIKit

/// `TMBarButton` that consists of a single label - that's it!
///
/// Probably the most commonly seen example of a bar button.
public final class TMLabelBarButton: TMBarButton {
    
    // MARK: Defaults
