2016-11-24 4 views
0

私はUIScrollViewにすべてのウィンドウを塗りつぶしています。これには、使用可能なすべての幅を埋めるUILabelsを追加したい垂直のUIStackViewが含まれています。UIStackViewを制約することはできますか?

UIStackViewUIScrollViewのすべてのエッジに固定されており、UIScrollViewをすべて埋めると考えられます。しかし、それは完全にすべてのconstriantsを無視して、それはそれだけの子供に合うサイズです。なぜその行動ですか?私はそのようにラベル追加した場合ことを示すために

scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView])) 
    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView])) 

    for _ in 1 ... 20 { 
     let textLabel = UILabel() 
     textLabel.backgroundColor = UIColor.yellow 
     textLabel.text = "Hi World xxxx" 
     stackView.addArrangedSubview(textLabel) 
     textLabel.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = true //Doesn't work as expected 

    } 

を私が得るものはこれです:(シアンの背景がUIScrollViewであり、あなたはラベルが原因それにすべての幅をとらないことがわかりますUIStackView contraintsは)

Result with stackview contraints

を適用しません。そして、私はscrollViewを使用するラベルcontraintを変更する場合にのみ、必要に応じて、それが動作します:

0123予想通り
textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true 

その後の結果は次のとおりです。 enter image description here

なぜその行動?誰かが私が期待している通りにUIStackViewの制約がうまくいかない理由を説明することができますか?

完全なソースコードavaiable at that gist

+0

こんにちはlujop、 'alignAllCenterX'はあなたのコードには何の効果もありません。それを削除することができます。 – BangOperator

答えて

1

すべてが正しいです。コンテンツビュー(スタックビュー)の幅を指定していないことだけです。 この行を追加すると、問題は完全に機能します。

scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1).isActive = true; 

注:、コンテンツビューに幅を提供していないコンテンツビューと末尾のスクロールビュー有数のピン留め。別の幅の制約が必要であり、コンテンツビューの幅がその固有の幅に等しいことが必要です。 リンク:https://stackoverflow.com/a/18341997/1790683

+0

ありがとう@BangOperator。幅の制約が必要な理由について詳しく知りましたか?通常は境界線にピン留めするだけで幅を決めることができますが、そうではありませんか? – lujop

+0

はいスクロールビューは少し異なります。あなたはautolayoutでuiscrollviewをgoogleすることができます。私はすぐに関連するリンクを貼り付けます – BangOperator

関連する問題