IPhone - UIView addSubview Gap наверху

У меня есть представление, которое загружается в MainWindow.xib. Это просто представление с изображением uiimageview, в котором отображается изображение на весь экран (320 x 480). Когда приложение загружается, я показываю это представление, а затем я делаю

[self.view addSubview:tabbarController.view];

Контроллер панели вкладок - это только UITabBarController с 2 контроллерами просмотра, добавленными к нему. Когда он добавляет представление tabbarController в subview, он оставляет пробел в верхней части около 20 пикселей. У моего приложения есть строка состояния, но это в основном комната для другого. Это происходит, если я не добавлю это в свой контроллер представления:

self.view.frame = CGRectMake(0, 0, 320, 480);

Может кто-нибудь объяснить это. Я делал

self.view = tabbarController.view;

но мне сказали, что я не должен этого делать. Итак, теперь я добавляю subview, но я не понимаю, почему мне нужно настроить CGRect моего представления, чтобы не показывать 20px.

Ответ 1

UITabBarController ожидает, что его представление добавлено как подзаголовок UIWindow, а не как подзаголовок некоторого другого UIView. Свойство frame определяет смещение представления в пределах его супервизора, поэтому реализация UITabBarController по умолчанию смещает свой кадр представления на 20 пикселей, оставляя место для строки состояния. Вы используете UITabBarController нестандартным способом, добавив его в представление, которое уже было смещено на 20 пикселей для строки состояния. UITabBarController смещает свой вид на 20 пикселов относительно его супервизора, вызывая разницу, которую вы видите.

Один чистый способ исправить это - добавить представление UITabBarController в качестве подзадачи окна вместо представления:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view];

(Примечание. Метод keyWindow возвращает только ваше окно, если вы уже вызвали makeKeyAndVisible. В противном случае вы можете установить свойство окна на свой UIViewController.)