Balázs Vincze
Balázs Vincze

Reputation: 3840

Adjust navigation bar title font size to fit text

Is it possible to adjust the font size of the navigation bar's title to fit the text?

Upvotes: 4

Views: 7803

Answers (3)

Jerome
Jerome

Reputation: 2162

Swift 5

private var isFirst = true
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    guard isFirst else {
    return
    }
    isFirst = false
    // Adjust Navigation Title by text
    if let navigationController = navigationController {
    let bar = navigationController.navigationBar
    var minX: CGFloat = 0
    var maxX: CGFloat = bar.bounds.width
    if let lastLeft = navigationItem.leftBarButtonItems?.last, let leftView = lastLeft.view, let buttonBarStackViewFrame = leftView.superview?.frame {
        minX = buttonBarStackViewFrame.maxX
    }
    if let firstRight = navigationItem.rightBarButtonItems?.first, let rightView = firstRight.view, let buttonBarStackViewFrame = rightView.superview?.frame {
        maxX = buttonBarStackViewFrame.minX
    }

    let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: maxX - minX, height: bar.bounds.height))
    titleLabel.text = LocStr(.favorite_master_title)
    titleLabel.adjustsFontSizeToFitWidth = true
    titleLabel.minimumScaleFactor = 0.3
    titleLabel.textColor = UIColor.white
    titleLabel.textAlignment = .center
    if UIDevice.current.modelName.contains(PLUS) {
        titleLabel.font = UIFont(name: GENERAL_FONT_NAME, size: PLUS_NAVIGATION_BAR_TITLE_FONT)!
    } else {
        titleLabel.font = UIFont(name: GENERAL_FONT_NAME, size: GENERAL_NAVIGATION_BAR_TITLE_FONT)!
    }
    navigationItem.titleView = titleLabel
    }
}

with a Extension

extension UIBarButtonItem {
    var view: UIView? {
        return value(forKey: "view") as? UIView
    }
}

Upvotes: -2

Harrison Xi
Harrison Xi

Reputation: 796

You can create a UILabel and set it to UINavigationItem's titleView. See Apple doc: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationItem_Class/#//apple_ref/occ/instp/UINavigationItem/titleView

For the created UILabel, you can set the adjustsFontSizeToFitWidth & minimumScaleFactor properties to let it fit the title. Doc: https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UILabel_Class/#//apple_ref/occ/instp/UILabel/adjustsFontSizeToFitWidth

Some codes:

- (void)setMyTitle:(NSString *)title
{
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.navigationController.view.bounds.size.width - 100, 44)];
    titleLabel.text = title;
    titleLabel.font = [UIFont systemFontOfSize:16];
    titleLabel.textColor = ...
    ...
    self.navigationItem.titleView = titleLabel;
}

Upvotes: 3

Arno
Arno

Reputation: 481

Try the following in viewDidLoad:

NSDictionary *attributes = @{ NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Bold" size:14] };

[self.navigationController.navigationBar setTitleTextAttributes:attributes];

NOTE: The downside to this solution is that you have to know the font size up front and set it manually. I'm not sure if you can set the navigation bar's title label to automatically change the font size to fit the text.

EDIT:
Turns out you can set the navigation bar's label to resize the font size dynamically

Upvotes: 0

Related Questions