Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPhone Title and Subtitle in Navigation Bar

Tags:

In my application, I'd like to have the navigation bar display a title and subtitle.

To that extent, I added the following code to my view controller:

// Replace titleView CGRect headerTitleSubtitleFrame = CGRectMake(0, 0, 200, 44);     UIView* _headerTitleSubtitleView = [[[UILabel alloc] initWithFrame:headerTitleSubtitleFrame] autorelease]; _headerTitleSubtitleView.backgroundColor = [UIColor clearColor]; _headerTitleSubtitleView.autoresizesSubviews = YES;  CGRect titleFrame = CGRectMake(0, 2, 200, 24);   UILabel *titleView = [[[UILabel alloc] initWithFrame:titleFrame] autorelease]; titleView.backgroundColor = [UIColor clearColor]; titleView.font = [UIFont boldSystemFontOfSize:20]; titleView.textAlignment = UITextAlignmentCenter; titleView.textColor = [UIColor whiteColor]; titleView.shadowColor = [UIColor darkGrayColor]; titleView.shadowOffset = CGSizeMake(0, -1); titleView.text = @""; titleView.adjustsFontSizeToFitWidth = YES; [_headerTitleSubtitleView addSubview:titleView];  CGRect subtitleFrame = CGRectMake(0, 24, 200, 44-24);    UILabel *subtitleView = [[[UILabel alloc] initWithFrame:subtitleFrame] autorelease]; subtitleView.backgroundColor = [UIColor clearColor]; subtitleView.font = [UIFont boldSystemFontOfSize:13]; subtitleView.textAlignment = UITextAlignmentCenter; subtitleView.textColor = [UIColor whiteColor]; subtitleView.shadowColor = [UIColor darkGrayColor]; subtitleView.shadowOffset = CGSizeMake(0, -1); subtitleView.text = @""; subtitleView.adjustsFontSizeToFitWidth = YES; [_headerTitleSubtitleView addSubview:subtitleView];  _headerTitleSubtitleView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |                                       UIViewAutoresizingFlexibleRightMargin |                                       UIViewAutoresizingFlexibleTopMargin |                                       UIViewAutoresizingFlexibleBottomMargin);  self.navigationItem.titleView = _headerTitleSubtitleView; 

And also implemented a method:

-(void) setHeaderTitle:(NSString*)headerTitle andSubtitle:(NSString*)headerSubtitle {     assert(self.navigationItem.titleView != nil);     UIView* headerTitleSubtitleView = self.navigationItem.titleView;     UILabel* titleView = [headerTitleSubtitleView.subviews objectAtIndex:0];     UILabel* subtitleView = [headerTitleSubtitleView.subviews objectAtIndex:1];     assert((titleView != nil) && (subtitleView != nil) && ([titleView isKindOfClass:[UILabel class]]) && ([subtitleView isKindOfClass:[UILabel class]]));     titleView.text = headerTitle;     subtitleView.text = headerSubtitle; } 

Things work beautifully, thanks.

Except that when rotating the iPhone to Landscape, the title+subtitle don't downsize in an automatic manner like the default title of the navigation item.

Any pointers?

Thanks!

like image 439
Reuven Avatar asked May 12 '10 08:05

Reuven


People also ask

How do I change the navigation bar on my Iphone?

A user changes the navigation bar's style, or UIBarStyle , by tapping the “Style” button to the left of the main page. This button opens an action sheet where users can change the background's appearance to default, black-opaque, or black- translucent.

What is navigation bar in iOS?

A navigation bar appears at the top of an app screen, enabling navigation through a hierarchy of content. A navigation bar also provides a natural place to display a screen's title — helping people orient themselves in your app or game — and it can include controls that affect the screen's content.

How do I customize my navigation bar in SwiftUI?

To change a navigation bar color in SwiftUI, you apply toolbarBackground modifier to the content view of NavigationStack . NavigationView is deprecated in iOS 16. toolbarBackground accepts two parameters. ShapeStyle : The style to display as the background of the bar.


1 Answers

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];     } } 
like image 57
Alex Reynolds Avatar answered Sep 23 '22 01:09

Alex Reynolds