実行時に画面のサブビューに制約を追加しようとしています。これはクラッシュを引き起こしています。以下は私のコードです:iOS Autolayoutは問題を制限します。アプリケーションがクラッシュする
for var i in 0 ..< 5{
let aController = storyboard.instantiateViewController(withIdentifier: "design")
let itemView = aController.view
//itemView!.frame.origin.x = CGFloat(i) * itemView!.frame.width
itemView!.translatesAutoresizingMaskIntoConstraints = false
itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .trailing, relatedBy: .equal, toItem: itemView!, attribute: .trailing, multiplier: 1, constant: 20))
itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .leading, relatedBy: .equal, toItem: itemView!, attribute: .leading, multiplier: 1, constant: 0))
itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .top, relatedBy: .equal, toItem: itemView!, attribute: .top, multiplier: 1, constant: 20))
itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .bottom, relatedBy: .equal, toItem: itemView!, attribute: .bottom, multiplier: 1, constant: 20))
scrollView.addSubview(itemView!)
}
そして、私は取得していますエラーは下の通りです:
2017年10月23日10:39:37.087674 + 0530 RollerCoasterPotential [998:22689] [LayoutConstraints]ビュー階層は、 制約のために準備されていません。
ビューに追加すると、そのビューのアイテムはビュー(またはビュー自体)の の子孫でなければなりません。ビュー階層がアセンブルされる前に制約 を解決する必要がある場合、これはクラッシュします。ブレークするには - [UIView(UIConstraintBasedLayout)_viewHierarchyUnpreparedForConstraint:]でデバッグします。
2017年10月23日10:39:37.087924 + 0530 RollerCoasterPotential:中[998 22689] * アサーションの失敗 - [UIViewの _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:]、 /BuildRoot /ライブラリ/キャッシュ/ COM。 apple.xbs /ソース/ UIKit_Sim/UIKitの-3688.4/NSLayoutConstraint_UIKitAdditions.m:734 2017年10月23日10:39:+ 0530 37.177966 RollerCoasterPotential [998:22689] * キャッチされない例外により 'NSInternalInconsistencyException' にアプリを終了理由: 'ビューの階層が制約のために用意されていない レイアウトを設定することはできません。'
ViewControllerでscrollViewを定義して追加する方法はありますか? –
ScrollViewはInterface Builder(動的に追加されません)を介して追加されました。 – TechBee
まず、scrollatesAutoresizingMaskIntoConstraintsをscrollviewにfalseに設定する必要はないと思います。 itemViewごとにfalseを設定する必要があります。次に、Autolayoutを使用している場合、itemviewのフレームの起点を設定する必要はありません。第3に、itemviewの自動レイアウト制約を作成して、scrollviewに追加する必要があります。他の方法はしないでください。 –