我正在構建一個複雜的項目,其中,我需要將UIPageViewController設置爲主視圖的子視圖。我使用自動佈局,並使用約束來對主視圖上的各種元素進行排序。在UIPageViewController上將TranslatesAutoresizingMaskIntoConstraints設置爲No
問題是,當我嘗試運行該應用程序時,由於衝突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
)對其進行約束的方法。但我真的很想聽聽解決這個問題的方法。
編輯: 我發現了一個黑客來解決這個問題。我不太確定我在這裏列出的是整個解決方案,但這是我現在注意到的,經過一個多月的修補代碼之後。
首先,在樹立pageviewcontroller視圖控制器,我有以下兩行,我已經初始化pageviewcontroller
UIView *pageView = self.pageViewController.view;
pageView.frame = self.view.frame;
不,我已經在這個視圖控制器設置[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
之後。
其次,在子控制器上,我檢查視圖是在pageviewcontroller內部還是外部使用。只有在瀏覽控制器中使用而不是時,纔會在子視圖上設置[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
。
現在,這個工作(對我來說)目前。但我真的很喜歡一個不太冒險的解決方案。
這次事故可能是由於其他原因。如果發生衝突約束,通常會忽略其中的一個(並記錄事實)。你能粘貼整個堆棧跟蹤嗎? –
它說(舉個例子): 「將嘗試打破約束,以恢復 歇上objc_exception_throw趕上這在調試器。 中列出的UIView上的UIConstraintBasedLayoutDebugging類別中的方法也可能有所幫助。「 但是除此之外沒有相關的日誌消息。它發出這條消息後確實崩潰了。 –
Rubberduck
你能描述一下你想要實現的目標嗎?這將是非常有用的,以提供任何形式的建議:) –