Проблема в том, что в идеале UINavigationController должен быть прямым подвидом UIWindow. Он будет позиционировать и размер прямо сам по себе. Когда вы добавляете UINavigationController в другое настраиваемое представление подпредставления UIWindow, вам необходимо позаботиться о положении и размере этого настраиваемого представления, учитывая, отображается ли строка состояния в окне UIWindow.
Мое предложение состоит в том, чтобы сделать пользовательское представление подклассом UINavigationController:
mySubClass_NavigationController*nav=[[mySubClass_NavigationController alloc] initWithRootViewController:viewController ];
[myUIWindow addSubview:nav.view];
и внутри mySubClass_NavigationController вы можете сделать всю настройку, которую вы делаете сейчас в себе (независимо от того, что это за контроллер).