2015-07-07 21 views
13

Sto cercando di aggiungere dei vincoli a un pulsante di accesso a Facebook sdk.aggiungere i vincoli al livello di programmazione

Ho il pulsante all'interno di una vista di scorrimento e sto tentando di aggiungere un vincolo superiore a un'etichetta che si trova anche nella vista di scorrimento. Sono in grado di aggiungere con successo il vincolo di altezza senza errori di run time ma il vincolo effettivo non sembra essere applicato al pulsante.

@IBOutlet weak var orLbl: UILabel! 
@IBOutlet weak var scrollView: UIScrollView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    var loginFBButton = FBSDKLoginButton() 
    loginFBButton.readPermissions = ["public_profile", "email"] 

    let heightConstraint = NSLayoutConstraint(
     item: loginFBButton, 
     attribute: NSLayoutAttribute.Height, 
     relatedBy: NSLayoutRelation.Equal, 
     toItem: nil, 
     attribute: NSLayoutAttribute.NotAnAttribute, 
     multiplier: 1, 
     constant: 41) 
    let topConstraint = NSLayoutConstraint(
     item: loginFBButton, 
     attribute: NSLayoutAttribute.TopMargin, 
     relatedBy: NSLayoutRelation.Equal, 
     toItem: self.orLbl, 
     attribute: NSLayoutAttribute.BottomMargin, 
     multiplier: 1, 
     constant: 31) 
    let leadingConstraint = NSLayoutConstraint(
     item: loginFBButton, 
     attribute: NSLayoutAttribute.Leading, 
     relatedBy: NSLayoutRelation.Equal, 
     toItem: self.registerButton, 
     attribute: NSLayoutAttribute.Left, 
     multiplier: 1, 
     constant: 0) 
    let trailingConstraint = NSLayoutConstraint(
     item: loginFBButton, 
     attribute: NSLayoutAttribute.Leading, 
     relatedBy: NSLayoutRelation.Equal, 
     toItem: self.registerButton, 
     attribute: NSLayoutAttribute.Right, 
     multiplier: 1, 
     constant: 0) 

    self.scrollView.addSubview(loginFBButton) 
    //loginFBButton.center = self.scrollView.center 

    loginFBButton.addConstraints([heightConstraint, topConstraint]) 

} 

Poi, quando ho includono l'aggiunta del vincolo top, sto ottenendo un errore di runtime:

Quando aggiunta ad una vista, gli elementi del vincolo devono essere discendenti di quella vista (o la vista stessa) . Questo si bloccherà se il vincolo deve essere risolto prima dell'assemblaggio della gerarchia della vista.

Terminare l'applicazione a causa dell'eccezione non rilevata 'NSGenericException', motivo: 'Impossibile installare il vincolo sulla vista. Il vincolo fa riferimento a qualcosa al di fuori del sottostruttura della vista? Questo è illegale.

Sia l'etichetta che il pulsante di Facebook sono nella mia vista di scorrimento? Ho anche stampato o Lbl.superview e loginFBButton.superview e sto ottenendo uiscrollview opzionale per entrambi

+0

Hai provato a capire, quale dei due vincoli provoca l'eccezione? – freytag

+0

@freytag si come menzionato nella domanda, è stato quando ho aggiunto il vincolo principale, stava succedendo l'incidente. Un altro utente ha suggerito di aggiungere i vincoli alla scrollview invece del loginFBButton. L'ho fatto e non ho avuto errori di runtime ma poi il mio pulsante facebook è in alto a sinistra dello schermo e l'etichetta o è completamente fuori dallo schermo – user2363025

risposta

28

C'è un nuovo (iOS8, OS 10.10), un modo più semplice per attivare i vincoli che non implica capire quali viste per aggiungerli a. I vincoli sanno già che considera di appartenenza, quindi prima assicurarsi che le opinioni sono state aggiunte come subviews, quindi chiamare il metodo della classe activateConstraints su NSLayoutConstraint per attivarli:

NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint]) 

Quando si crea elementi dell'interfaccia utente a livello di codice, è necessario dire a iOS di non trasformare la sua cornice in vincoli. Per fare questo, subito dopo la creazione loginFBButton fare:

per SWIFT 1.2:

loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false) 

Per Swift 2.0 & 3.0:

loginFBButton.translatesAutoresizingMaskIntoConstraints = false 

Infine, si sta per bisogno di più vincoli. Suggerisco di impostare un vincolo di larghezza per il tuo loginFBButton e di aggiungere un vincolo per posizionare il pulsante orizzontalmente.

+0

Ho aggiornato il codice per includere tutti i vincoli che stavo usando. Quindi a questo punto aggiungo ancora dei vincoli e quindi settando il valore translateAutoresizingMaskIntoConstraints o qual è il flusso? – user2363025

+0

Crea il tuo pulsante, imposta translatesizingMaskIntoConstraints su false, aggiungi il tuo pulsante a scrollView, crea i vincoli e attivali. – vacawama

+0

grazie, ho capito che funziona, loginFBButton.setTranslatesAutoresizingMaskIntoConstraints (false). Dovevo anche assicurarmi di aggiungere i vincoli alla vista di scorrimento e non al pulsante LoginFBButton. Tuttavia, non ho dovuto utilizzare i vincoli di attivazione – user2363025