Подтвердить что ты не робот

Изменение высоты UINavigationBar

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

Вот что я до сих пор:

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

Ответ 1

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

.h файл

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

и .m file

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

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

Ответ 2

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

Настройка отображения панели навигации

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

● Свойство barStyle

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

● Свойство tintColor

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

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

Ответ 3

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

Ответ 4

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

CGFloat navBarHeight = 10.0f;    
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];

Ответ 5

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

- (void)viewWillAppear {

UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}

Ответ 6

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

Ответ 7

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

@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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

Попробуйте этот код внутри метода - (void)viewDidLayoutSubviews,

CGFloat navBarHeight = 10.0f;    
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];

Ответ 12

Создание категории и переопределение метода sizeThatFits (_ size: CGSize) → CGSize изменяет размер UINavigationBar по всему приложению. Предполагая, что вы хотите изменить высоту/размер UINavigationBar только в одном конкретном ViewController (в моем случае)

Вот как я это сделал.

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)
    }
}

в вызывающем объекте ViewController будет выглядеть как

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")
}