Ошибка вращения UIPageViewController + Auto Layout

У меня есть UIPageViewController с простым UIViewController внутри него.

Если UIViewController не имеет дочерних объектов, его представление при правильном изменении правильное. (Сплошной зеленый фон).

portraitlandscape

Если UIViewController имеет подчиненный объект с фиксированным фреймом, его представление при правильном изменении правильного размера. (Сплошной зеленый фон с желтым квадратом в углу).

portraitlandscape

Если UIViewController имеет подвью с ограничениями автоматического макета, установленными для заполнения своего супервизора, его представление больше не изменяется при правильном изменении при повороте. (Сплошной желтый фон с красным фоном UIPageViewController). Используемый мной код автомата:

UIView *v = [[UIView alloc] init];
[v setTranslatesAutoresizingMaskIntoConstraints:NO];
[v setBackgroundColor:[UIColor yellowColor]];
[[self view] addSubview:v];

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(v);

NSArray *cs = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]|" options:0 metrics:nil views:viewsDictionary];
[[self view] addConstraints:cs];

cs = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v]|" options:0 metrics:nil views:viewsDictionary];
[[self view] addConstraints:cs];

portraitlandscape

Почему автоматический макет подзаголовка влияет на его супервизор? Это происходит только в том случае, если он содержится в UIPageViewController.

Ответ 1

Я понял:

Я назвал [[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO]; в классе контроллера контейнера и явно не задал ограничения автоматического макета на своем представлении (или представлениях, о которых упоминал скучный астронавт).

Ответ 2

У меня тоже была эта проблема, и предыдущие ответы, похоже, мало помогли. Мне нужно было добавить ограничения на scrollview, используемые с помощью PageViewController.

// Add Paging View Controller
self.addChildViewController(self.pageViewController)
self.pageViewController.didMoveToParentViewController(self)
self.containerView.addSubview(self.pageViewController.view)

// Add Constraints
var verticalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view])
var horizontalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view])

self.pageViewController.view.setTranslatesAutoresizingMaskIntoConstraints(false)
self.containerView.addConstraints(verticalConstraints)
self.containerView.addConstraints(horizontalConstraints)

// Add Constraints for the Scrollview
//This line is a bit of a hack.  If Apple ever changes the structure of the UIPageViewController, this could break.
let scrollView = self.pageViewController.view.subviews.first! as UIView  
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":scrollView])
horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":scrollView])
self.pageViewController.view.addConstraints(verticalConstraints)
self.pageViewController.view.addConstraints(horizontalConstraints)

Ответ 3

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

Ответ 4

@Bored Ответ астронавта почти сработал у меня. Единственное, что я сделал, кроме того, что авторезистировать маски для преобразования в автоматические макеты, - это установить рамку представления UIPageViewController, прежде чем добавлять ее в родительский вид.

[self addChildViewController:pageViewController];
pageViewController.view.frame = self.view.frame;
[self.view addSubview:pageViewController.view];
[pageViewController didMoveToParentViewController:self];

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