Skip to content

Instantly share code, notes, and snippets.

@nazywamsiepawel
Last active July 20, 2023 11:58
Show Gist options
  • Star 44 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save nazywamsiepawel/0166e8a71d74e96c7898 to your computer and use it in GitHub Desktop.
Save nazywamsiepawel/0166e8a71d74e96c7898 to your computer and use it in GitHub Desktop.
UINavigationBar with subtitle / swift
func setTitle(title:String, subtitle:String) -> UIView {
let titleLabel = UILabel(frame: CGRect(x:0, y:-5, width:0, height:0))
titleLabel.backgroundColor = UIColor.clear
titleLabel.textColor = UIColor.gray
titleLabel.font = UIFont.boldSystemFont(ofSize: 17)
titleLabel.text = title
titleLabel.sizeToFit()
let subtitleLabel = UILabel(frame: CGRect(x:0, y:18, width:0, height:0))
subtitleLabel.backgroundColor = UIColor.clear
subtitleLabel.textColor = UIColor.black
subtitleLabel.font = UIFont.systemFont(ofSize: 12)
subtitleLabel.text = subtitle
subtitleLabel.sizeToFit()
let titleView = UIView(frame: CGRect(x:0, y:0, width:max(titleLabel.frame.size.width, subtitleLabel.frame.size.width), height:30))
titleView.addSubview(titleLabel)
titleView.addSubview(subtitleLabel)
let widthDiff = subtitleLabel.frame.size.width - titleLabel.frame.size.width
if widthDiff > 0 {
var frame = titleLabel.frame
frame.origin.x = widthDiff / 2
titleLabel.frame = frame.integral
} else {
var frame = subtitleLabel.frame
frame.origin.x = abs(widthDiff) / 2
titleLabel.frame = frame.integral
}
return titleView
}
// Use :
self.navigationItem.titleView = setTitle("title", "subtitle")
// Source : http://stackoverflow.com/questions/12914004/uinavigationbar-titleview-with-subtitle
@poojakaluskar
Copy link

Thank you for writing this. It really helped me.

@dadixon
Copy link

dadixon commented Sep 28, 2018

This works great! One question is how can this go under the left bar button instead of beside it?

@X901
Copy link

X901 commented Jan 12, 2019

I joined @odonckers and @blinkelvin code together

 func setTitle(title: String, titleColor: UIColor, titleSize: Int, subtitle: String, subtitleColor: UIColor, subtitleSize: Int , view: UIView) -> UIView {
    let titleLabel = UILabel(frame: CGRect(x:0, y:-5, width: view.frame.width - 100, height: 20))

    titleLabel.backgroundColor = UIColor.clear
    titleLabel.textColor = titleColor
    titleLabel.adjustsFontSizeToFitWidth = false
    titleLabel.font = UIFont.boldSystemFont(ofSize: CGFloat(titleSize))
    titleLabel.lineBreakMode = .byTruncatingTail
    titleLabel.textAlignment = .center
    titleLabel.text = title
    
    let subtitleLabel = UILabel(frame: CGRect(x:0, y:18, width: view.frame.width - 100, height: 10))
    subtitleLabel.backgroundColor = UIColor.clear
    subtitleLabel.textColor = subtitleColor
    subtitleLabel.adjustsFontSizeToFitWidth = false
    subtitleLabel.lineBreakMode = .byTruncatingTail
    subtitleLabel.textAlignment = .center
    subtitleLabel.font = UIFont.systemFont(ofSize: CGFloat(subtitleSize))
    subtitleLabel.text = subtitle
    
    let titleView = UIView(frame: CGRect(x:0, y:0, width: view.frame.width - 30, height:30))
    titleView.addSubview(titleLabel)
    titleView.addSubview(subtitleLabel)

    return titleView
}

here is an example of how to use it

 self.navigationItem.titleView = setTitle(title: "TITLE", titleColor: UIColor.black, titleSize: 16, subtitle: "SUBTITle", subtitleColor: UIColor.gray, subtitleSize: 12, view: self.view)

I notice it looks very good with Regular NavigationBar
but with Large NavigationBar it stays on the same size

it needs to improve with Large Navigation bar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment