Вид UIViewController имеет странный 20px y margin

Я добавляю представление UIViewController к другим представлениям UIViewController (используя новые API-интерфейсы UIViewController Containment). После добавления vc-представления в качестве другой подвивки, есть странный 20px margin сверху.

Я зарегистрировал представление, и он из источника был 0,0. Однако, когда я регистрирую представление viewview, это:

<UIViewControllerWrapperView: 0x6c5e2c0; frame = (0 20; 703 748); autoresize = RM+BM; layer = <CALayer: 0x6c54190>>

Я могу, очевидно, изменить его на 0,0. Но мне интересно, как правильно это сделать? Почему vc view viewview frame 0,20? Должен ли я изменить это или есть лучший способ обойти этот странный запас?

Спасибо

Ответ 1

Узнал, в чем проблема. Нужно вызвать addChildViewController: на себя. Итак, вот последовательность вызовов, которые вам нужно сделать, чтобы заставить сдерживание работать правильно:

[self addChildViewController:navVC];
[navVC didMoveToParentViewController:self];
[mainView addSubview:navVC.view];

self - это контроллер родительского представления. navVC - контроллер дочернего представления, который вы добавляете. mainView - это представление в контроллере родительского представления, к которому вы собираетесь добавить представление контроллера детского просмотра.

Ответ 2

Чтобы устранить эту проблему, просто check the box "Wants Full Screen" на раскадровке.

Проблема возникает из-за того, что ParentViewController показывает панель навигации.

Как сказано в документации Apple:

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

Ответ 3

Я предпочитаю код ниже, работает для меня.

    [self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

Ответ 4

Вам нужно добавить одну строку перед загрузкой контроллера первого представления

- (void) viewDidLoad 
{
     self.automaticallyAdjustsScrollViewInsets = NO;
     [super viewDidLoad];
}

Ответ 5

Даже если вы попытались установить выпадающее меню "Строка состояния" на "none", проверьте свойства размера вашего представления. Удостоверьтесь, что он еще не получил некоторого жестко заданного значения высоты 460, или y происхождения 20 (в графическом дизайнере Xcode). И если вы хотите, чтобы этот вид заполнил все его родительское представление, убедитесь, что маска авторезиста установлена ​​в свойствах, которые должны быть прикреплены ко всем сторонам (сверху, слева, внизу, справа) и, возможно, также растянуты.

Просто глядя на ваш отладочный вывод, похоже, что свойства авторезистировки устанавливаются только на UIViewAutoresizingFlexibleBottomMargin и UIViewAutoresizingFlexibleRightMargin.

Наконец, содержащее представление, вероятно, должно иметь флажок Авторезистировать Subviews.

Ответ 6

Взгляните на свойство needsFullScreenLayout. Если установлено YES, представление будет проходить ниже UIStatusBar.

Ответ 7

У меня была та же проблема, но я решил ее в IOS 9 с помощью ограничений (в построителе интерфейса). Я не использовал полноэкранный режим, потому что он устарел. Добавьте ограничение ведущего и trailingMargin и дайте им константу -20

введите описание изображения здесь

Ответ 8

Хотя у меня нет опыта работы с API-интерфейсами сдерживания, я решил много проблем "за-20", установив строку состояния "Нет" (см. ниже) в "Identity Inspector".

Ответ 9

Просто используйте этот метатег viewport.

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

Ввод "height = device-height" там вызовет эту проблему.