2014-11-03 13 views
16

Ho aggiunto uno UIView utilizzando l'IB sul controller di visualizzazione. Chiamiamolo il redView.Aggiunta di una sottoview e posizione con vincoli a livello di codice

enter image description here

allora ho appuntato il suo tutti e quattro i lati con i vincoli di layout automatico nel codice e quando l'eseguo, sembra che questo come previsto.

enter image description here

Ora voglio aggiungere un UILabel a questa visione di programmazione e posizionarlo al centro utilizzando i vincoli di layout automatico.

Di seguito è riportato il codice che ho finora.

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet private var redView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     redView.setTranslatesAutoresizingMaskIntoConstraints(false) 

     let leadingConstraint = NSLayoutConstraint(item: redView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1, constant: 0) 
     let trailingConstraint = NSLayoutConstraint(item: redView, attribute: .Trailing, relatedBy: .Equal, toItem: view, attribute: .Trailing, multiplier: 1, constant: 0) 
     let topConstraint = NSLayoutConstraint(item: redView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 0) 
     let bottomConstraint = NSLayoutConstraint(item: redView, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1, constant: 0) 
     view.addConstraints([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint]) 


     let label = UILabel() 
     label.text = "Auto Layout Exercise" 
     redView.addSubview(label) 

     let xCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: redView, attribute: .CenterX, multiplier: 1, constant: 0) 
     let yCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: redView, attribute: .CenterY, multiplier: 1, constant: 0) 
     let leadingConstraint1 = NSLayoutConstraint(item: label, attribute: .Leading, relatedBy: .Equal, toItem: redView, attribute: .Leading, multiplier: 1, constant: 20) 
     let trailingConstraint1 = NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: redView, attribute: .Trailing, multiplier: 1, constant: -20) 
     redView.addConstraints([xCenterConstraint, yCenterConstraint, leadingConstraint1, trailingConstraint1]) 

    } 

} 

Il problema è l'etichetta non appare sulla redView. Qualcuno può dirmi cosa mi manca qui?

Grazie.

risposta

37

Sono abbastanza sicuro che è necessario impostare anche:

label.setTranslatesAutoresizingMaskIntoConstraints(false) 

Altrimenti non credo che i vincoli verranno applicati per l'etichetta.

+1

E in realtà si dovrebbe vedere un messaggio nella console in tal senso. – matt

+0

E grazie a Dio per questo messaggio nella console, poiché è praticamente garantito che io _ dimenticherò ogni volta quella riga di codice. :) – matt

+0

Sì, questa era la causa. Una volta ho provato con la riga 'setTranslatesAutoresizingMaskIntoConstraints' di redView' commentata ma non ha influito sulla vista, quindi ho pensato che questa linea non fosse obbligatoria. Immagino sia per le viste create a livello di codice. Grazie. – Isuru

11

Nota per Swift 2/3

È stato modificato in proprietà booleana: UIView.translatesAutoresizingMaskIntoConstraints

Invece di essere in precedenza:

label.setTranslatesAutoresizingMaskIntoConstraints(false) 

E 'ora:

label.translatesAutoresizingMaskIntoConstraints = false 
3

Hai bisogno di fare questo per ogni UIControl assegnare NSConstraints

label.translatesAutoresizingMaskIntoConstraints = false 
Problemi correlati