Настраиваемая высота панели UINavigationBar: как настроить представления содержимого?


В моем приложении есть пользовательская панель навигации высотой 59 (виртуальных) пикселей, в отличие от 44 пикселей стандартного UINavigationController UINavigationBar Apple. Я применяю стиль к панели со следующим вызовом во время запуска приложения:

UIImage *navBarImage = [UIImage imageNamed:@"navigation-bar.png"];
[[UINavigationBar appearance] setBackgroundImage:navBarImage
                                   forBarMetrics:UIBarMetricsDefault];
Проблема, к которой это приводит, заключается в том, что это в основном изображение, нанесенное на верхнюю часть экрана в начале стандартной навигационной панели. Базовая панель навигации не имеет представления о том, что ее размер изменился. Это делает содержимое просмотров (вид, помещенный в стек навигации) показать 15 пикселей под пользовательской панелью.

Я не смог найти способ изменить размер и положение навигационного вида UINavigationController.

Каков наиболее элегантный способ учета этой настройки? Следующие (не изящные) работы, но поскольку операции применяются после того, как вид был отрисован, сдвиг в положении и изменении размера очень заметен пользователю и выглядит довольно дилетантский:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGRect frame = self.view.frame;
    self.view.frame = CGRectMake(frame.origin.x, frame.origin.y + 15, frame.size.width, frame.size.height - 15);
}
Все контроллеры, помещенные в навигационный стек, относятся к подклассу UIViewController, реализующему описанный выше метод.

Огромное спасибо!

1 3

1 ответ:

Я знаю, что это старо, но поскольку вы так и не получили ответа, я подумал, что могу опубликовать, как я решил эту проблему.

Я отправил аналогичный вопрос, но у меня была еще одна проблема в дополнение к вашей. Мне указали на вопрос о том, как установить высоту UINavigationBar, и верхний ответ отлично сработал для меня. Пользователь предлагает создать пользовательскую категорию UINavigationBar и переопределить метод-sizeThatFits. Это решает проблему вашего приложения, не распознающего увеличенную высоту UINavigationBar, а также дополнительная проблема представлений в UINavigationBar, не являющихся кликабельными ниже нижней строки 44px по умолчанию.