Oceandrive
Oceandrive

Reputation:

Change UINavigationBar Height

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

Answers (12)

ghr
ghr

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

Chamira Fernando
Chamira Fernando

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

Group
Group

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

Beninho85
Beninho85

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

abdul sathar
abdul sathar

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

Josh Gafni
Josh Gafni

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

Yerkezhan
Yerkezhan

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

Gil Margolin
Gil Margolin

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

Augustine P A
Augustine P A

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

Shimon Wiener
Shimon Wiener

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

tachikoma
tachikoma

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

Cliff Viegas
Cliff Viegas

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

Related Questions