Предотвращение UINavigationController от настройки источника, когда строка состояния скрыта в iOS 7

У меня есть серия UINavigationControllers внутри контроллера UITabBar. Я хочу скрыть строку состояния. Однако, когда я это делаю, панель навигации приспосабливается к сокращению:

Изображение проблемы

enter image description here

Как я могу предотвратить это и получить что-то вроде изображения ниже?

желаемый результат

enter image description here

В настоящее время я просто скрываю строку состояния с помощью [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

Ответ 1

Создайте пользовательский UINavigationBar с настраиваемым размеромThatFits.

@implementation UINavigationBar (customNavigationBar)
  - (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(self.frame.size.width,64);
    return newSize;
  }
@end

если какие-либо запросы комментариев PLS

Ответ 2

Вы можете создать Container View внутри своей раскадровки и установить фиксированное верхнее пространство (такое же, как строка состояния). Затем вы можете вставить свой NavigationController в этот вид.

Изображение 1

enter image description here

Изображение 2

enter image description here

Надеюсь, это поможет.

Изменить: Добавленные изображения

Ответ 3

В appDelegate.m - создайте контроллер навигации и установите его в контроллер корневого представления

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{       
       UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];


        HomeViewController *homeViewController = (HomeViewController *)[storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];

        self.navigationController = [[UINavigationController alloc] initWithRootViewController:homeViewController];

        [self.navigationController setNavigationBarHidden:YES];

        self.window.rootViewController = self.navigationController;

        return YES;
}

Затем вместо панели навигации вы можете повторно создать панель навигации с помощью кнопки UIImageView + label + и т.д.  
Затем вам нужно дать правильную маску авторазмера, чтобы UIImageView правильно настраивался  
Custom navigationBar

Ответ 4

Вот измененная версия ответа на кодеркарт. Когда строка состояния скрыта, строка origin.y навигационной панели равна 0. В этом случае я устанавливаю ее высотой до 64. Когда строка состояния не скрыта, сохраните высоту по умолчанию 44.

@implementation UINavigationBar (customNavigationBar)
- (CGSize)sizeThatFits:(CGSize)size {
    CGPoint originInWindow = [self.window convertPoint:CGPointZero fromView:self];
    CGFloat height = originInWindow.y > 1 ? 44 : 64;
    return CGSizeMake(self.frame.size.width, height);
}
@end