2013-07-18 5 views
12

У меня есть UIPageViewController с простым UIViewController внутри него.UIPageViewController + Автоматический выбор ротации макета

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

portraitlandscape

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

portraitlandscape

Если UIViewController имеет подвид с его авто ограничений макета набор, чтобы заполнить его SuperView, его вид больше не изменяет правильно при вращении. (Яркий желтый фон с красным фоном 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

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

ответ

0

Я понял это:

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

+2

Привет, старший. У меня такая же проблема, что и в вашем вопросе. Вы могли бы предоставить небольшой пример кода с этим ответом? Я делаю все с автоматической компоновкой через язык Visual Format (как и вы), и когда я вращаюсь, мой UIPageViewController делает именно то, что сделал ваш. Вы сказали «и не устанавливали явно ограничения автоматического макета в своем представлении» - если бы вы могли предоставить код для этого, это очень помогло бы мне и предоставило бы более полный ответ. Благодаря! – DiscDev

7

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

+0

Использование авторезистирующих масок устраняет проблему, спасибо. Я по-прежнему не знаю, почему на просмотр содержимого UIViewController будет влиять ограничение авто макета его дочернего представления. – Senior

10

У меня тоже была эта проблема, и предыдущие ответы, похоже, мало помогли. Мне нужно было добавить ограничения на 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) 
+0

Приятный, я смог исправить свои проблемы с AutoLayout с помощью UIPageViewController внутри контейнера с этим ответом. – Paludis

+0

Спасибо! Ты мой мастер :) – Unmerciful

0

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

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

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

Смежные вопросы