2

プログラムで単純なレイアウトを実行しようとしていますが、単純なものが欠けているか、何かがずれていると思います。次の ViewController は、ラベルをスーパー ビューの中央に配置する必要があります。ただし、このトリミングされたメッセージでクラッシュします:The view hierarchy is not prepared for the constraint ... When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled... View not found in container hierarchy: ... That view's superview: NO SUPERVIEWこのエラーメッセージを伴う他のSOの質問は、ほとんどの部分でペン先を使用しています。私はそれを避けるか、Obj-C代わりにswift. この質問はトピックを少し扱っ​​ていますが、少し古いです。

誰かが私を正しい方向に向けることができますか?

class ViewController: UIViewController {
let label1 = UILabel() as UILabel

func layoutView(){

    label1.text = "Click to see device configuration"
    label1.setTranslatesAutoresizingMaskIntoConstraints(false)
    view.addSubview(label1)
    let viewsDictionary = ["label1":label1]

    let label1_H:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[label1]-|",
        options: NSLayoutFormatOptions(0),
        metrics: nil,
        views: viewsDictionary)

    let label1_V:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[label1]-|",
        options: NSLayoutFormatOptions(0),
        metrics: nil, views:
        viewsDictionary)

    label1.addConstraints(label1_H) // Comment these 2 lines and it runs, but
    label1.addConstraints(label1_V) // of course the label is upper left

}

override func viewDidLoad() {
    super.viewDidLoad()
    layoutView()
}
}
4

2 に答える 2

4

これらの制約は、ラベルとそのスーパービューの間で作成されます。制約は、ラベルではなく、そのスーパービューに追加する必要があります。

于 2014-09-22T00:09:00.367 に答える
3

あなたはほとんどそこにいます。次の行を置き換えるだけです...

label1.addConstraints(label1_H) // Comment these 2 lines and it runs, but
label1.addConstraints(label1_V) // of course the label is upper left

...次のコードで:

view.addConstraints(label1_H) // Comment these 2 lines and it runs, but
view.addConstraints(label1_V) // of course the label is upper left

ただし、制約H:|-[label1]-|"およびはおよびV:|-[label1]-|"と同等です (デフォルトのマージンの詳細については、iOS 開発者ライブラリを参照してください)。したがって、これらの制約は、ラベルを中央に配置するためのものではありません。実際には、viewController のビューに対して 8 単位の上部、先頭、末尾、および下部の余白を持つ巨大なラベルが作成されます。H:|-8-[label1]-8-|"V:|-8-[label1]-8-|"

メソッドに次のコード行を追加して、layoutView()私の意味を確認してください。

label1.backgroundColor = UIColor.orangeColor()

問題ありませんが、本当にラベルを中央に配置したい場合は、次のコードを使用する必要があります。

func layoutView() {
    label1.text = "Click to see device configuration"
    label1.backgroundColor = UIColor.orangeColor()
    //Set number of lines of label1 to more than one if necessary (prevent long text from being truncated)
    label1.numberOfLines = 0

    label1.setTranslatesAutoresizingMaskIntoConstraints(false)
    view.addSubview(label1)

    let xConstraint = NSLayoutConstraint(item: label1,
        attribute: NSLayoutAttribute.CenterX,
        relatedBy: NSLayoutRelation.Equal,
        toItem: view,
        attribute: NSLayoutAttribute.CenterX,
        multiplier: 1.0,
        constant: 0.0)
    self.view.addConstraint(xConstraint)

    let yConstraint = NSLayoutConstraint(item: label1,
        attribute: NSLayoutAttribute.CenterY,
        relatedBy: NSLayoutRelation.Equal,
        toItem: view,
        attribute: NSLayoutAttribute.CenterY,
        multiplier: 1.0,
        constant: 0)
    self.view.addConstraint(yConstraint)

    //Add leading and trailing margins if necessary (prevent long text content in label1 to be larger than screen)
    let viewsDictionary = ["label1" : label1]
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-(>=10@750)-[label1]-(>=10@750)-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary))
}
于 2014-09-22T01:01:52.060 に答える