Reputation:
Can some one tell me how to change the navigation bar height?
Here is what i have so far:
CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;
Upvotes: 22
Views: 84304
Reputation: 516
sizeThatFits: no longer works with iOS11 UINavigationBar subclasses. Apple Engineering have confirmed that this technique was never supported and with iOS11 changes sizeThatFits: is no longer consulted.
Upvotes: 9
Reputation: 6846
Creating category and overriding sizeThatFits(_ size: CGSize) -> CGSize method changes UINavigationBar size all over the app. Assuming you want to change UINavigationBar height/size only in one particular ViewController (in my case)
This is how I did it.
extension UINavigationBar {
open override func sizeThatFits(_ size: CGSize) -> CGSize {
let v = self.value(forKey: "frame") as? CGRect
return v?.size ?? CGSize(width: UIScreen.main.bounds.width, height: 44)
}
}
in caller ViewController would look like
override func viewDidLoad() {
super.viewDidLoad()
configureNavigationBar()
}
private func configureNavigationBar() {
var naviBarFrame = self.navigationController?.navigationBar.frame
naviBarFrame?.size.height = 74
let rect = naviBarFrame ?? CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 74)
self.navigationController?.navigationBar.setValue(rect, forKey: "frame")
}
Upvotes: 0
Reputation: 335
Try this code inside - (void)viewDidLayoutSubviews
method,
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
Upvotes: 0
Reputation: 3311
Most Simple and Effective Solution is to add a category to navigation bar. (but maybe not the best solution)
@interface UINavigationBar (CustomHeight)
@end
@implementation UINavigationBar (CustomHeight)
- (CGSize)sizeThatFits:(CGSize)size {
CGRect screenRect = [[UIScreen mainScreen] bounds];
return CGSizeMake(screenRect.size.width, kNavBarHeightNoStatus);
}
@end
knavBarHeightNoStatus is the height of your navbar. We use UIScreen bounds because frame of UINavigationBar is wrong
PS: Be careful, you can have some issues using it with a SideMenu
Upvotes: 4
Reputation: 2396
Following code won't affect other parameters in frame except height
[self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 150)];
if you want change other parameters means, just edit the any one of the parameters....
Upvotes: 1
Reputation: 2881
I ran into a lot of problems depending on the method chosen. In my specific case, the navigation bar was hidden throughout the app except in the Settings View Controller. As I needed to specify a custom height of the navigation bar and show the navigation bar at the same time, the segue between the source view controller and the Settings View Controller had a very sloppy animation.
The absolute best solution can be found here: https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2. I just imported the category into the Settings View Controller, and in viewDidLoad
called the setHeight:
method on `self.navigationController.navigationBar'. Looks great!
Upvotes: 2
Reputation: 481
I have solved this issue, I created the subclass of UINavigationController. In this MainNavigationViewController.m file I rewrite viewDidLayoutSubviews() method, where I set the frame for self.navigationBar
Upvotes: 8
Reputation: 2119
You should not change the height of the navigation bar. From Apple Programing Guide on View Controller:
Customizing the Navigation Bar Appearance
In a navigation interface, a navigation controller owns its UINavigationBar object and is responsible for managing it. It is not permissible to change the navigation bar object or modify its bounds, frame, or alpha values directly. However, there are a few properties that it is permissible to modify, including the following:
● barStyle property
● translucent property
● tintColor property
(taken from Apple: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html)
-- UPDATE -- IOS 7 --- still only the available properties can be changed but below is a great tutorial on how to achieve flexibility in the navigation bar http://www.appcoda.com/customize-navigation-status-bar-ios-7/
Upvotes: 21
Reputation: 5068
Override -(void)viewWillAppear method in the viewController and Try the code below,
- (void)viewWillAppear {
UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}
Upvotes: 6
Reputation: 1180
You can create a category class based on UINavigationBar
like this
.h file
#import UIKit/UIKit.h
@interface UINavigationBar (myNave)
- (CGSize)changeHeight:(CGSize)size;
@end
and .m file
#import "UINavigationBar+customNav.h"
@implementation UINavigationBar (customNav)
- (CGSize)sizeThatFits:(CGSize)size {
CGSize newSize = CGSizeMake(320,100);
return newSize;
}
@end
It works very nice.
Upvotes: 25
Reputation: 31
self.navigationController.navigationBar.frame
is a readonly
property on iOS version 4.x
it will be changed even though, you will see abnormal behavior.
for example, when app state changed to background and get back to foreground the Navigation bar will show original sized height
Upvotes: 3
Reputation: 3216
Try using -
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
Upvotes: 5