我正在构建一个复杂的项目,除其他外,我需要将 UIPageViewController 设置为主视图的子视图。我正在使用自动布局,并使用约束对主视图上的各种元素进行排序。
问题是,当我尝试运行应用程序时,由于 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;
}
但两者都没有任何效果。
我需要限制我正在做的事情,所以坚持使用 Masks 不是一种选择。我认为我正在寻找的是一种在添加 UIPageViewController 子项后(通过任何进程调用viewControllerBeforeViewController
)对它们施加约束的方法。但我真的很想听听任何可以解决这个问题的方法。
编辑: 我找到了解决问题的方法。我不太确定我在这里列出的是否是整个解决方案,但这是我现在注意到的,经过一个多月的修改代码。
首先,在设置 pageviewcontroller 的视图控制器中,在初始化 pageviewcontroller 之后,我有以下两行
UIView *pageView = self.pageViewController.view;
pageView.frame = self.view.frame;
不是我[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
在这个视图控制器中设置的。
其次,在子控制器上,我检查视图是在 pageviewcontroller 内部还是外部使用。仅当视图未在页面视图控制器中使用时才[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
在子视图上设置。
现在,这目前(对我来说)有效。但我真的很想要一个不那么老套的解决方案。