Добавление UINavigationController в качестве подзадачи UIView

Я пытаюсь отобразить 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 пикселей? Или сообщить ему, что он не должен компенсировать строку состояния?

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

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

Ответы

Ответ 1

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

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

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

Ответ 3

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

CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

в качестве опорного кадра, и сделать что-то вроде этого:

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

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

Ответ 4

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

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

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

- (void) viewDidAppear:(BOOL)animated {
    if (navigationController.navigationBar.frame.origin.y != 0) {
        [[navigationController view] removeFromSuperview];
        [[self view] addSubview:navigationController.view];
    }
}