Я строю сложный проект, где, среди прочего, мне нужно установить UIPageViewController как дочернее представление основного вида. Я использую autolayout и используя ограничения для упорядочения различных элементов основного вида.
Проблема в том, что когда я пытаюсь запустить приложение, он выходит из строя из-за противоречивых NSAutoresizingMaskLayoutConstraints.
2013-10-28 16:22:18.419 Red Event App[1658:60b] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x145c1990 V:|-(20)-[UINavigationBar:0x145bf6b0] (Names: '|':UIView:0x145bf620 )>",
"<NSLayoutConstraint:0x145bf510 V:[UINavigationBar:0x145bf6b0]-(0)-[UIView:0x145bef70]>",
"<NSLayoutConstraint:0x145d0550 UIView:0x145a8c10.top == UIView:0x145bf620.top>",
"<NSAutoresizingMaskLayoutConstraint:0x145b3a40 h=-&- v=-&- UIView:0x145a8c10.midY == UIView:0x145bef70.midY + 56.5>",
"<NSAutoresizingMaskLayoutConstraint:0x145b3a70 h=-&- v=-&- UIView:0x145a8c10.height == UIView:0x145bef70.height + 113>"
)
Обычным средством для этого является установка TranslatesAutoresizingMaskIntoConstraints на no.
Однако, когда я это делаю, дочерние представления UIPageViewController начинают игнорировать границы PageViewController и заканчивают (насколько я вижу) с началом (0,0).
Я попытался исправить положение, установив рамки вручную как при настройке источника данных (_itemViewControllers):
- (void)setupLeafs{
_itemViewControllers = [[NSMutableArray alloc]init];
for(NSString *pagename in _datasource){
RWNode *page = [_xml getPage:pagename];
UIViewController *viewController = [RWNavigationController getViewControllerFromDictionary:[page getDictionaryFromNode]];
viewController.view.frame = CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y,self.view.frame.size.width, self.view.frame.size.height);
[_itemViewControllers addObject:viewController];
}
}
и при получении страницы
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
UIViewController *nextViewController = [self getPreviousLeaf:viewController];
nextViewController.view.frame = CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y,self.view.frame.size.width, self.view.frame.size.height);
return nextViewController;
}
но не имеет никакого эффекта.
Мне нужны ограничения для того, что я делаю, поэтому придерживаться Масок не вариант. Я думаю, что я ищу способ установить ограничения на дочерние элементы UIPageViewController после того, как они были добавлены (любыми вызовами процесса viewControllerBeforeViewController). Но мне очень хотелось бы услышать, как можно решить эту проблему.
Edit: Я нашел взломать решение проблемы. Я не совсем уверен, что то, что я перечисляю здесь, - это все решение, но это то, что я замечаю прямо сейчас, после того, как более месяца возится с кодом.
Во-первых, в контроллере представления, который настраивает контроллер просмотра страницы, у меня есть следующие две строки после того, как я инициализировал pageviewcontroller
UIView *pageView = self.pageViewController.view;
pageView.frame = self.view.frame;
Не то, что я установил [self.view setTranslatesAutoresizingMaskIntoConstraints:NO]; в этом контроллере представления.
Во-вторых, на дочерних контроллерах я проверяю, используется ли представление внутри или вне контроля просмотра страницы. Только если представление не используется в диспетчере просмотра страницы, [self.view setTranslatesAutoresizingMaskIntoConstraints:NO]; установлен на дочернем представлении.
Теперь это работает (для меня) на данный момент. Но мне бы очень хотелось, чтобы решение было менее взломанным.