Может кто-нибудь сказать мне, как изменить высоту навигационной панели?
Вот что я до сих пор:
CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;
Может кто-нибудь сказать мне, как изменить высоту навигационной панели?
Вот что я до сих пор:
CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;
Вы можете создать класс категории на основе 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
Это работает очень хорошо.
Вы не должны изменять высоту панели навигации. Из руководства 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/
Я решил эту проблему, я создал подкласс UINavigationController. В этом файле MainNavigationViewController.m я переписываю метод viewDidLayoutSubviews(), где я устанавливаю фрейм для self.navigationBar
Попробуйте использовать -
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
Переопределить - (void) viewWillAppear метод в viewController и попробовать код ниже,
- (void)viewWillAppear {
UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}
sizeThatFits: больше не работает с подклассами iOS11 UINavigationBar. Apple Engineering подтвердила, что этот метод никогда не поддерживался, а с изменениями iOS11 sizeThatFits: больше не проконсультируется.
Наиболее простым и эффективным решением является добавление категории в панель навигации. (но, возможно, не лучшее решение)
@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
self.navigationController.navigationBar.frame
- это свойство readonly
на iOS версии 4.x
он будет изменен, хотя вы увидите ненормальное поведение.
например, когда состояние приложения изменилось на задний план и вернется на передний план, панель навигации отобразит высоту исходного размера
У меня возникло множество проблем в зависимости от выбранного метода. В моем конкретном случае панель навигации была скрыта во всем приложении, за исключением контроллера параметров. Поскольку мне нужно было указать настраиваемую высоту панели навигации и одновременно отображать навигационную панель, переход между контроллером представления источника и контроллером просмотра настроек имел очень неаккуратную анимацию.
Абсолютное лучшее решение можно найти здесь: https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2. Я просто импортировал категорию в Контроллер представлений настроек, а в viewDidLoad
- метод setHeight:
на `self.navigationController.navigationBar '. Выглядит отлично!
Следующий код не влияет на другие параметры в кадре, кроме высоты
[self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 150)];
если вы хотите изменить другие параметры, просто отредактируйте любой из параметров....
Попробуйте этот код внутри метода - (void)viewDidLayoutSubviews
,
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
Создание категории и переопределение метода 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")
}