2017-02-10 12 views
2

私は、制約をプログラムで追加する方法について頭を下ろそうとしています。これまでのところ私はそうのように私のコードを持っている:私はアプリを実行すると先行制約を追加すると、プログラムによってプログラムがクラッシュする

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     //addViewStandard() 
     addConstraintsView() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    func addConstraintsView() { 
     let someView = UIView(frame: CGRect.zero) 
     someView.backgroundColor = UIColor.blue 
     // I want to mimic a frame set of CGRect(x: 20, y: 50, width: 50, height: 50) 
     let widthConstraint = NSLayoutConstraint(item: someView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let heightConstraint = NSLayoutConstraint(item: someView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let leadingConstraint = NSLayoutConstraint(item: someView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 20) 
     someView.translatesAutoresizingMaskIntoConstraints = false 
     someView.addConstraints([widthConstraint, heightConstraint, leadingConstraint]) 
     view.addSubview(someView) 

    } 
} 

は、今では大手ため、制約のクラッシュします。エラーメッセージは、 "制約のために準備されていないビュー階層を持つレイアウトを設定することはできません"です。私はここで間違って何をしていますか?オブジェクト(この場合は青いボックス)に制約を追加するのか、それともそのスーパービューに追加するべきなのでしょうか?

編集:私は、コードを変更した後

:すべての

func addConstraintsView() { 
     let someView = UIView(frame: CGRect.zero) 
     someView.backgroundColor = UIColor.blue 
     view.addSubview(someView) 
     someView.translatesAutoresizingMaskIntoConstraints = false 
     let widthConstraint = NSLayoutConstraint(item: someView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let heightConstraint = NSLayoutConstraint(item: someView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let leadingConstraint = NSLayoutConstraint(item: someView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1.0, constant: 20) 
     someView.addConstraints([widthConstraint, heightConstraint]) 
     view.addConstraints([leadingConstraint]) 
    } 

答えて

2

まず、

view.addSubview(someView) 
someView.translatesAutoresizingMaskIntoConstraints = false 

は制約フェーズの前に来る必要があります。 someViewがスーパービューに追加された後に制約を適用する必要があります。あなたはiOSの9をターゲットにしている場合

また、私は

let widthConstraint = someView.widthAnchor.constraint(equalToConstant: 50.0) 
let heightConstraint = someView.heightAnchor.constraint(equalToConstant: 50.0) 
let leadingConstraint = someView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0) 
NSLayoutConstraint.activate([widthConstraint, heightConstraint, leadingConstraint]) 

のようにあなたに制約を適用するためにどのビューを心配する必要はありません。この方法は、レイアウトのアンカーを使用することをアドバイスしたいです。

最後に(疑問を解決するため)、レイアウトアンカーを使用できない場合は、先頭の制約をビューではなくスーパービューに追加する必要があります。

+0

これは助けになりました。それは今働いている!ありがとう! – KexAri

+0

それは私の喜びでした! –

関連する問題