Добавление UINavigationController в качестве подпредставления UIView - PullRequest
13 голосов
/ 27 марта 2010

Я пытаюсь отобразить UILabel поверх UINavigationController. Проблема в том, что когда я добавляю UILabel в качестве подпредставления UIWindow, он не будет автоматически вращаться, поскольку он не является подпредставлением UIViewController (UIViewController автоматически обрабатывает обновление подпредставлений во время поворотов).

Это иерархия, которую я использовал:

  • UIWindow
    • UILabel
    • UINavigationController

Поэтому я подумал, что мог бы использовать следующую иерархию:

  • UIWindow
    • UIViewController
      • UIView
        • UILabel
        • UINavigationController

Таким образом, метка может отображаться в верхней части панели UINavigationController, а также автоматически поворачиваться, поскольку она является подпредставлением UIViewController.

Проблема в том, что когда я пытаюсь добавить UINavigationController в качестве подпредставления представления:

[myViewController.view addSubview:myNavigationController.view];

появится 20 пикселей вниз. Я предполагаю, потому что он думает, что ему нужно освободить место для строки состояния. Но, поскольку UINavigationController размещается внутри UIView, который не перекрывает верхнюю часть строки состояния, он неправильно добавляет дополнительные 20 пикселей. Другими словами, верхняя часть UINavigationBar находится на отметке 40 пикселей на экране, а не на 20 пикселях.

Есть ли какой-нибудь простой способ просто сдвинуть UINavigationController и все его элементы (например, панель навигации, панель инструментов, контроллер корневого представления) на 20 пикселей? Или дать ему понять, что он не должен компенсировать строку состояния?

Если нет, я думаю, мне нужно будет использовать мою первую иерархию, упомянутую выше, и выяснить, как повернуть метку, чтобы она соответствовала повороту навигационной панели. Где я могу найти больше информации о том, как это сделать?

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

Ответы [ 4 ]

18 голосов
/ 27 марта 2010

Использование этого кода, кажется, работает:

nav.view.frame = CGRectMake(nav.view.frame.origin.x, nav.view.frame.origin.y - 20,
                          nav.view.frame.size.width, nav.view.frame.size.height);

Я сделал это до добавления контроллера навигации в качестве подпредставления. Использование [UIApplication sharedApplication] .statusBarFrame вместо жестко запрограммированного 20 также, вероятно, будет хорошей идеей.

Я не уверен, что это лучший способ сделать это.

2 голосов
/ 01 ноября 2011

Почему вы не используете фрейм приложения вместо добавления некоторых значений к источникам? Я имею в виду использование:

CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

в качестве системы отсчета и сделайте что-то вроде этого:

nav.view.frame = CGRectMake(appFrame.origin.x, appFrame.origin.y, ...

Этот работал для меня.

2 голосов
/ 23 сентября 2010

Если вы хотите, чтобы фрейм представлял доступную область содержимого, тогда вы должны просто использовать: [[UIScreen mainScreen] applicationFrame]. Конечно, это ограничивает ваш контроллер представления верхнего уровня, так что он может быть только верхним уровнем. Так что все еще изворотливо, но не так.

0 голосов
/ 17 апреля 2012

У меня была такая же проблема, но мне удалось ее исправить.

Я заметил, что у представления моего контроллера представления был правильный кадр, но у навигационной панели контроллера представления не было (у этого было начало кадра (0,20)).

Вставьте это в контроллер представления, который является суперпредставлением контроллера навигации:

- (void) viewDidAppear:(BOOL)animated {
    if (navigationController.navigationBar.frame.origin.y != 0) {
        [[navigationController view] removeFromSuperview];
        [[self view] addSubview:navigationController.view];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...