2017-10-23 14 views
0

実行時に画面のサブビューに制約を追加しようとしています。これはクラッシュを引き起こしています。以下は私のコードです: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' にアプリを終了理由: 'ビューの階層が制約のために用意されていない レイアウトを設定することはできません。'

+0

ViewControllerでscrollViewを定義して追加する方法はありますか? –

+0

ScrollViewはInterface Builder(動的に追加されません)を介して追加されました。 – TechBee

+0

まず、scrollat​​esAutoresizingMaskIntoConstraintsをscrollviewにfalseに設定する必要はないと思います。 itemViewごとにfalseを設定する必要があります。次に、Autolayoutを使用している場合、itemviewのフレームの起点を設定する必要はありません。第3に、itemviewの自動レイアウト制約を作成して、scrollviewに追加する必要があります。他の方法はしないでください。 –

答えて

1

これを試してください:あなたはscrollviewに項目を追加する前に、制約を追加している

func addConstraints() { 
    var itemViews:[UIView] = [] 
    for i in 0 ..< 5 { 
     let aController = storyboard!.instantiateViewController(withIdentifier: "design") 
     let itemView = aController.view 
     itemView!.translatesAutoresizingMaskIntoConstraints = false 
     scrollView.addSubview(itemView!) 
     itemViews.append(itemView!) 
     scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .trailing, relatedBy: .equal, toItem: scrollView, attribute: .trailing, multiplier: 1, constant: 20)) 
     scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .leading, relatedBy: .equal, toItem: scrollView, attribute: .leading, multiplier: 1, constant: 0)) 

     if(i == 0) { 
      scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .top, relatedBy: .equal, toItem: scrollView, attribute: .top, multiplier: 1, constant: 20)) 
     } else { 
      let previousView = itemViews[i-1] 
      itemView!.addConstraint(NSLayoutConstraint(item: previousView!, attribute: .top, relatedBy: .equal, toItem:itemView!, attribute: .top, multiplier: 1, constant: 20)) 
     } 

     if i == 4 { 
      scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .bottom, relatedBy: .equal, toItem: scrollView, attribute: .bottom, multiplier: 1, constant: 20)) 
     } 

    } 
} 
+0

すべてのビューがまとめられています。お互いに重なる – TechBee

+0

@TechBee:私は答えを編集しました。 –

+0

Nope。それはアプリをクラッシュさせている。最初の要素は、上下左右のスペースを固定していなければなりませんが、それに続くitemViewは水平なスペースしか持たないようにしてください。上部と下部は修正する必要があります。ではない? – TechBee

0

。以下のエラーが発生しました。

'制約のために準備ができていないビュー階層でレイアウトを設定することはできません。'

代わりに、項目をスクロールビューに追加してから制約を適用してください。おそらくこのようなものでしょう。 (あなたの残りの制約が良いと仮定します)

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 

    //Below add your view 

    scrollView.addSubview(itemView!) 

    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)) 

} 
関連する問題