Скорее всего, вы хотите сделать UINavigationController корневым контроллером представления для окна, а не того контроллера представления, который у вас есть сейчас. Это был бы лучший способ сделать это.
Причина, по которой вы видите это дополнительное поле вверху, состоит в том, что UINavigationController обычно ожидает, что его размер будет заполнять весь экран (за исключением, возможно, панели вкладок внизу, если она находится внутри UITabBarController), и поэтому ожидает что верхний край его обзора будет находиться под строкой состояния, если строка состояния видна. Поэтому он размещает панель навигации на 20 пикселей ниже верхней части своего обзора, чтобы оставить место для строки состояния, не удосуживаясь проверить, действительно ли его вид равен под строкой состояния. Интересно, что иногда операция повторной компоновки будет выполнять эту проверку, но это ненадежно. То, что я нашел, хорошо работает в такой ситуации: установить для свойства wantsFullScreenLayout
UINavigationController значение NO. Тогда я не пытаюсь оставить место для строки состояния, поэтому все работает как положено.