Add Subtitle Under the Title in Navigation Bar Controller in Xcode

Add subtitle under the title in navigation bar controller in Xcode

Though there is a solution but it has some known issues

Solution is writing a function like this

func setTitle(title:String, subtitle:String) -> UIView {
let titleLabel = UILabel(frame: CGRectMake(0, -2, 0, 0))

titleLabel.backgroundColor = UIColor.clearColor()
titleLabel.textColor = UIColor.grayColor()
titleLabel.font = UIFont.boldSystemFontOfSize(17)
titleLabel.text = title
titleLabel.sizeToFit()

let subtitleLabel = UILabel(frame: CGRectMake(0, 18, 0, 0))
subtitleLabel.backgroundColor = UIColor.clearColor()
subtitleLabel.textColor = UIColor.blackColor()
subtitleLabel.font = UIFont.systemFontOfSize(12)
subtitleLabel.text = subtitle
subtitleLabel.sizeToFit()

let titleView = UIView(frame: CGRectMake(0, 0, max(titleLabel.frame.size.width, subtitleLabel.frame.size.width), 30))
titleView.addSubview(titleLabel)
titleView.addSubview(subtitleLabel)

let widthDiff = subtitleLabel.frame.size.width - titleLabel.frame.size.width

if widthDiff < 0 {
let newX = widthDiff / 2
subtitleLabel.frame.origin.x = abs(newX)
} else {
let newX = widthDiff / 2
titleLabel.frame.origin.x = newX
}

return titleView
}

Using this function for custom navigation title view in viewDidLoad

self.navigationItem.titleView = setTitle("Title", subtitle: "SubTitle")

Only known issue is that if subtitle becomes very large than the misplacement occurs.

Final Outcome
Sample Image

Source: https://gist.github.com/nazywamsiepawel/0166e8a71d74e96c7898

Create a subtitle in navigationbar

Use the self.navBar.navigationItem.prompt = @"This is the subtitle";

It's from UIKit in the base UINavigationViewController.

Set Title and Subtitle to Navigation like WhatsApp

You can achieve such functionality by using this :

func setTitle(title:String, subtitle:String) -> UIView {

let titleLabel = UILabel(frame: CGRect(x: 0, y: -2, 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 = .clear
subtitleLabel.textColor = .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 {
let newX = widthDiff / 2
subtitleLabel.frame.origin.x = abs(newX)
} else {
let newX = widthDiff / 2
titleLabel.frame.origin.x = newX
}

return titleView
}

And call like that :

self.navigationItem.titleView = setTitle(title: "Title Title Title", subtitle: "ello Shabir how are you")

The result is like that :
Sample Image

How to add a subtitle below a large title in a navigation view in swift ui?

I have found a solution to what I was looking for: basically create the top of the screen as it would normally be without a navigationView and then add a scrollview underneath.

HStack {
VStack(alignment: .leading, spacing: 5) {
Text("Title")
.font(.largeTitle)
.foregroundColor(Color(UIColor.label))
.fontWeight(.bold)

Text("subtitle")
.font(.subheadline)
.foregroundColor(Color(UIColor.label))
}

Spacer()
}
.padding()



ScrollView(.vertical, showsIndicators: false) {}

How can you change the navigation bar title to an image? Other methods have not worked

initially set the frame for imageview

 let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
imageView.contentMode = .ScaleAspectFit

if let image = UIImage(named: "Profile")
{
imageView.image = image

}else
{
imageView.image = UIImage(named: "Profile.png")
}
self.navigationItem.titleView = imageView

iPhone Title and Subtitle in Navigation Bar

Make the titleView and subtitleView labels into properties of the view controller, so that you can access them from any method. Then, on rotation of the view controller, resize the labels:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self adjustLabelsForOrientation:toInterfaceOrientation];
}

- (void) adjustLabelsForOrientation:(UIInterfaceOrientation)orientation {
if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
titleView.font = [UIFont boldSystemFontOfSize:16];
subtitleView.font = [UIFont boldSystemFontOfSize:11];
}
else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
titleView.font = [UIFont boldSystemFontOfSize:20];
subtitleView.font = [UIFont boldSystemFontOfSize:13];
}
}

Custom Navigation Title in iOS 12

Creating your custom titleView and assigning it to navigationItem.titleView is what you want. On older systems (pre iOS 11) you just might need to call sizeToFit() on the titleView.

This way you can create this titleView

Swift

override func viewDidLoad() {
super.viewDidLoad()


let imageView = UIImageView()
NSLayoutConstraint.activate([
imageView.heightAnchor.constraint(equalToConstant: 20),
imageView.widthAnchor.constraint(equalToConstant: 20)
])
imageView.backgroundColor = .red

let titleLabel = UILabel()
titleLabel.text = "Custom title"

let hStack = UIStackView(arrangedSubviews: [imageView, titleLabel])
hStack.spacing = 5
hStack.alignment = .center

navigationItem.titleView = hStack
}

Obj-C

- (void)viewDidLoad {
[super viewDidLoad];

UIImageView *imageView = [[UIImageView alloc] init];
[NSLayoutConstraint activateConstraints:@[
[imageView.heightAnchor constraintEqualToConstant:20],
[imageView.widthAnchor constraintEqualToConstant:20]
]];
imageView.backgroundColor = [UIColor redColor];

UILabel *titleLabel = [[UILabel alloc] init];
titleLabel.text = @"Custom title";

UIStackView *hStack = [[UIStackView alloc] initWithArrangedSubviews:@[imageView, titleLabel]];
hStack.spacing = 5;
hStack.alignment = UIStackViewAlignmentCenter;

self.navigationItem.titleView = hStack;
}

title view

You might also need to have the right set of autolayout constraints or use UIStackView.



Related Topics



Leave a reply



Submit