2017-02-18 17 views
0

私はiOS開発を初めて利用しています。私はストーリーボードやxib/nibなしでレイアウトを構築したい。だから私はプログラムで制約を追加しようとしています。 プログラムで制約を追加する方法についてのチュートリアルを検索しました。しかし、このビューは正しく表示されません。プログラムで動的な幅の制約を追加する方法

私は私のViewControllerクラスでこのコードをしようとしている:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let testView = UIView() 
    self.view.addSubview(testView) 

    // Add Constraints 
    self.view.translatesAutoresizingMaskIntoConstraints = false 
    testView.translatesAutoresizingMaskIntoConstraints = false 

    let top = NSLayoutConstraint(item: testView, attribute: .top, relatedBy: .equal 
     , toItem: self.view, attribute: .top, multiplier: 1, constant: 50.0) 
    let bottom = NSLayoutConstraint(item: testView, attribute: .bottom, relatedBy: .equal 
     , toItem: self.view, attribute: .bottom, multiplier: 1, constant: -50.0) 
    let leading = NSLayoutConstraint(item: testView, attribute: .leading, relatedBy: .greaterThanOrEqual, toItem: self.view, attribute: .leading, multiplier: 1, constant: 50.0) 
    let trailing = NSLayoutConstraint(item: testView, attribute: .trailing, relatedBy: .greaterThanOrEqual, toItem: self.view, attribute: .trailing, multiplier: 1, constant: -50.0) 
    self.view.addConstraints([top, bottom, leading, trailing]) 
} 

一般的に、彼らは、ビューやチュートリアルでは、幅と高さについての制約の大きさを定義する必要はありません。しかし、ビューはチュートリアルで見ることができます。私の場合、私のtestViewは、トップ、ボトム、先行および後続の制約が設定されていてもアプリに表示することはできません。私は何かを逃したのですか?どうしたの?チュートリアルの

1: http://www.knowstack.com/swift-nslayoutconstraint-programatically-sample-code/

編集: 私はより多くを説明するのをしてみましょう。ユニバーサルデバイスに適したUIViewを作成したいと思います。 UIViewには、先頭、下位、先頭および末尾にconstant: 10という制約があります。だから、私はUIViewのサイズを設定する必要はありません。

Expected Result (I am using draw tool to simulate the result)

+0

ようこそ。あなたは尋ねる前にすべての類似した質問をチェックしましたか?たとえば、大規模な回答と説明を持っているようなもの:http://stackoverflow.com/questions/26180822/swift-adding-constraints-programmatically –

+0

私は以前この質問をチェックしていました。 「UIView」のサイズは、最も高いレートの答えの幅:100、高さ:100に定義されていました。私は私の質問を更新しました。確認してください、ありがとう。 – kk777

+0

他の解決策がない場合、または複数の回答がある場合は、制約を追加してからview.layoutIfNeededを追加してみてください。 –

答えて

2

これは80に等しい高さと画面の下部に表示制約の例である:

var yourView = UIView() 
yourView.translateAutoresizingMaskIntoConstraints = false 
yourSuperView.addSubview(yourView) 

// Pin the leading edge of yourView to the leading edge of the main view 
yourView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true 

// Pin the trailing edge of yourView to the leading trailing edge 
yourView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true 

// Pin the bottomedge of yourView to the margin's leading edge 
yourView .bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true 

// The height of your view 
yourView.heightAnchor.constraintEqualToConstant(80).active = true 
+0

複数の質問に対する回答の正確なコピーを投稿しないようにしてください。質問が重複していると感じる場合は、コメントを投稿して回答にリンクすることもできます。 –

0

あなたは二つの問題があります。

  1. をしませんself.view.translatesAutoresizingMaskIntoConstraints = falseと設定します。追加しているサブビューに対しては、translatesAutoresizingMaskIntoConstraintsを設定する必要があります。

  2. .equal制約の代わりに.greaterThanOrEqual制約を使用しています。その問題は、多くの揺れの部屋を残し、あなたのtestViewに幅が0になるような値を取得していることです。値を正しく拘束する.equalに変更した場合。

+0

'self.view.translatesAutoresizingMaskIntoConstraints = false'を削除して' .greaterThanOrEqual'を '.equal'に変更した後、まだ' testView'が画面に表示されません – kk777

+0

更新されたコードを質問に追加しますが、元のコードは削除しないでください。 .greaterThanOrEqualsと.equalを両方とも変更しましたか? – vacawama

関連する問題