私はUIPageViewControllerをメインビューの子ビューとして設定する必要がある複雑なプロジェクトを構築しています。私はautolayoutを使用しており、制約を使用してメインビューのさまざまな要素を順序付けしています。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
を呼び出して)制約を加える方法だと思います。しかし、私は本当にこの問題が解決できる方法を聞いてみたいです。
編集: 私は問題を解決するためのハックを発見しました。私がここにリストアップしているものがソリューション全体であるかどうかはよく分かりませんが、コードで1か月以上の変更をしてから今すぐ気づいています。私は、このビューコントローラに[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
が設定されていることをpageviewcontroller
UIView *pageView = self.pageViewController.view;
pageView.frame = self.view.frame;
未初期化した後
まず、pageviewcontrollerを設定ビューコントローラでは、私は、次の2行を持っています。
第2に、子コントローラでは、ビューがページビューコントローラの内部または外部で使用されているかどうかを確認します。表示がの場合のみ、012viewerのページビューでが使用されていない場合は、子ビューで[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
が設定されます。
今、これは現時点で(私にとっては)うまくいきます。しかし、私は実際にはそれほどハッキーではない解決策を望んでいます。
クラッシュはおそらく他の原因によるものです。矛盾する制約がある場合、通常、それらの制約の1つを無視します(そして、事実を記録します)。スタックトレース全体を貼り付けることはできますか? –
それは(例を与えることを)言うん:<:0x15671b70のUIView:0x156cf3e0.bottom ==のUIView:0x1568a390.bottom NSLayoutConstraint> objc_exception_throw上 ブレークデバッガでこれをキャッチする は「 が制約を破って回復を試みますにリストされているUIViewのUIConstraintBasedLayoutDebuggingカテゴリのメソッドも役立ちます。 これ以外のログメッセージはありません。そして、このメッセージを与えた後にクラッシュします。 –
Rubberduck
あなたは_visually_達成しようとしているものを記述することができますか?それはどんな種類の助言を与えるために非常に便利だろう:) –