Изменить высоту UINavigationBar - PullRequest
22 голосов
/ 22 мая 2009

Может кто-нибудь сказать мне, как изменить высоту панели навигации?

Вот что у меня есть:

CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;

Ответы [ 12 ]

25 голосов
/ 17 января 2012

Вы можете создать класс категории на основе UINavigationBar, как это

.h файл

#import UIKit/UIKit.h    
@interface UINavigationBar (myNave)
- (CGSize)changeHeight:(CGSize)size;
@end

и .m файл

#import "UINavigationBar+customNav.h"
@implementation UINavigationBar (customNav)
- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(320,100);
    return newSize;
}
@end

Работает очень хорошо.

21 голосов
/ 23 сентября 2011

Вы не должны изменять высоту панели навигации. Из руководства по программированию Apple на View Controller:

Настройка внешнего вида панели навигации

В интерфейсе навигации контроллер навигации владеет своим объектом UINavigationBar и отвечает за его управление. Не разрешается изменять объект панели навигации или изменять его границы, рамки или альфа-значения напрямую. Однако есть несколько свойств, которые можно изменять, включая следующие:

● свойство barStyle

● полупрозрачное свойство

● свойство tintColor

(взято из Apple: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html)

- ОБНОВЛЕНИЕ - IOS 7 --- пока можно изменить только доступные свойства, но ниже приведен большой урок о том, как добиться гибкости в панели навигации http://www.appcoda.com/customize-navigation-status-bar-ios-7/

7 голосов
/ 01 июля 2017

sizeThatFits: больше не работает с подклассами iOS11 UINavigationBar. Apple Engineering подтвердила, что этот метод никогда не поддерживался и с iOS11 изменяет sizeThatFits: больше не используется.

7 голосов
/ 26 сентября 2014

Я решил эту проблему, я создал подкласс UINavigationController. В этом файле MainNavigationViewController.m я переписываю метод viewDidLayoutSubviews (), где я устанавливаю фрейм для self.navigationBar

6 голосов
/ 04 декабря 2012

Переопределить - (void) метод viewWillAppear в viewController и попробуйте код ниже,

- (void)viewWillAppear {

UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}
5 голосов
/ 24 июля 2009

Попробуйте использовать -

CGFloat navBarHeight = 10.0f;    
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
4 голосов
/ 25 июня 2015

Самое простое и эффективное решение - добавить категорию на панель навигации. (но, возможно, не лучшее решение)

@interface UINavigationBar (CustomHeight)

@end


@implementation UINavigationBar (CustomHeight)

- (CGSize)sizeThatFits:(CGSize)size {
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    return CGSizeMake(screenRect.size.width, kNavBarHeightNoStatus);
}
@end

knavBarHeightNoStatus - высота вашей панели навигации. Мы используем границы UIScreen, потому что фрейм UINavigationBar неправильный

PS: будьте осторожны, у вас могут возникнуть проблемы с использованием SideMenu

3 голосов
/ 11 августа 2011

self.navigationController.navigationBar.frame - это свойство readonly в iOS версии 4.x

оно будет изменено, хотя вы увидите ненормальное поведение.

например, когда состояние приложения изменилось на фон и вернулось на передний план, панель навигации покажет высоту оригинального размера

2 голосов
/ 01 сентября 2015

Я столкнулся с множеством проблем в зависимости от выбранного метода. В моем конкретном случае панель навигации была скрыта во всем приложении, за исключением контроллера просмотра настроек. Поскольку мне нужно было указать настраиваемую высоту панели навигации и одновременно показать панель навигации, переход между контроллером представления источника и контроллером представления настроек был очень неаккуратным.

Абсолютно лучшее решение можно найти здесь: https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2. Я просто импортировал категорию в контроллер просмотра настроек, а в viewDidLoad вызвал метод setHeight: для self.navigationController.navigationBar. Отлично смотрится!

1 голос
/ 07 ноября 2015

Следующий код не повлияет на другие параметры в кадре, кроме высоты

 [self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 150)];

Если вы хотите изменить другие параметры, просто отредактируйте любой из параметров ....

...