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!
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.
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.
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.
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]; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With