2017-03-26 4 views
1

私は私のコードでプログラムこれらの制約を追加したい制約を複製することができません:は、プログラム

self.view.bringSubview(toFront: sceneView) 
    sceneView.bottomAnchor.constraint(equalTo: canvasUnderReference.topAnchor, constant: 0).isActive = true 
    sceneView.topAnchor.constraint(equalTo: playersScoreReference.bottomAnchor, constant: 0).isActive = true 
    sceneView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    sceneView.widthAnchor.constraint(equalToConstant: view.frame.width).isActive = true 
    print(sceneView.frame) 

これはアウト出力します:

(0.0, 0.0, 0.0, 0.0) 

enter image description here

これまでのところ、私はこれを得ました

なぜこれらの値が出力されますか?制約は追加されていませんか?

は私がのviewDidLoadでそれを試してみましたが、このFUNC:

override func viewDidLayoutSubviews() { 
    sceneView.backgroundColor = UIColor.clear 
    sceneView.ignoresSiblingOrder = true 
    self.view.addSubview(sceneView) 
    sceneScene = SKScene(fileNamed: "MyScene")! 
    sceneScene.backgroundColor = .white 
    sceneScene.scaleMode = .resizeFill 
    sceneView.showsNodeCount = true 
    let canvasUnderReference = CanvasUnder.layoutMarginsGuide 
    let playersScoreReference = playersScore.layoutMarginsGuide 
    sceneView.bottomAnchor.constraint(equalTo: canvasUnderReference.topAnchor, constant: 0).isActive = true 
    sceneView.topAnchor.constraint(equalTo: playersScoreReference.bottomAnchor, constant: 0).isActive = true 
    sceneView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    sceneView.widthAnchor.constraint(equalToConstant: view.frame.width).isActive = true 
    print(sceneView.frame) 
    sceneView.presentScene(sceneScene) 
    self.view.bringSubview(toFront: CanvasCards) 
    self.view.bringSubview(toFront: sceneView) 

} 

編集2:それはまだ0出力し

override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     sceneView.backgroundColor = UIColor.clear 
     sceneView.ignoresSiblingOrder = true 
     self.view.addSubview(sceneView) 
     sceneScene = SKScene(fileNamed: "MyScene")! 
     sceneScene.backgroundColor = .white 
     sceneScene.scaleMode = .resizeFill 
     sceneView.showsNodeCount = true 
     let canvasUnderReference = CanvasUnder.layoutMarginsGuide 
     let playersScoreReference = playersScore.layoutMarginsGuide 
     sceneView.bottomAnchor.constraint(equalTo: canvasUnderReference.topAnchor, constant: 0).isActive = true 
     sceneView.topAnchor.constraint(equalTo: playersScoreReference.bottomAnchor, constant: 0).isActive = true 
     sceneView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     sceneView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 
     sceneView.presentScene(sceneScene) 
     self.view.bringSubview(toFront: CanvasCards) 
     self.view.bringSubview(toFront: sceneView) 
} 

、0、0、0

+0

どこに制約を追加しましたか?どのような方法で、ビューライフサイクルのどの時点でですか? – Fahim

+0

* viewDidLoad *ではなく* viewWillLayoutSubviews *または* viewDidLayoutSUbview *を試してみてください。 – dfd

+0

私はviewDidLoad、viewWillLayoutSubvies、viewDidLayoutSubviewsでそれを持っていましたが、すべて動作せず、すべてが0,0,0,0を返しました –

答えて

1

セットアップ一度制約(のための例:viewDidLoad())。制約は、updateConstraints()が呼び出された後(updateConstraints()を呼び出さない限り、)までフレームに影響しません。

さらに、幅の制約は定数に設定しないでください。それをself.viewに制限したいとします。

override func viewDidLoad() { 
    super.viewDidLoad() 

    sceneView.bottomAnchor.constraint(equalTo: canvasUnderReference.topAnchor, constant: 0).isActive = true 
    sceneView.topAnchor.constraint(equalTo: playersScoreReference.bottomAnchor, constant: 0).isActive = true 
    sceneView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 

    // This is the proper way to create width constraint. 
    sceneView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    print(sceneView.frame) 
} 

私はupdateConstraints()は、すべてのビューで呼び出された後にそれが起こるか知っているので、私は、印刷のためにviewDidLayoutSubviews()を使用。

+0

問題は残っていますが、それでも0,0、0、0です。 –

+0

@ J.Doe私が見る次の場所は、 'sceneView'の他のすべての制約が確実に削除または非アクティブ化され、 'sceneView.translates Autoresizing Mask into Constraints'がfalseであることです。 'canvasUnderReference'と' playersScoreReference'が正しいことを確認してください。 –

+0

自動サイズ変更機能を無効にして翻訳が完了しました。ありがとう –