2015-08-26 8 views
5

Ho un cerchio al centro di uno schermo con un limite di margine di 50 su entrambe le estremità. Quindi, la larghezza del cerchio dipende dalla dimensione dello schermo.Ottieni altezza di visualizzazione in base ai vincoli di margine dopo l'esecuzione Swift

Quindi, quello che ho provato è stato questo:

Approccio 1

ho creato i margini nello storyboard per definire la larghezza cerchio (50 sulla sinistra e destra)

Poi ho utilizzato il seguente codice:

@IBOutlet weak var helpButHeight: NSLayoutConstraint! 
@IBOutlet weak var helpBut: UIButton! 

viewDidLoad:

012.
helpButHeight.constant = helpBut.frame.size.width 

Questo non ha funzionato.

Dal momento che la larghezza dello schermo è 400, e il margine è 50 su entrambe le estremità, quindi helpBut.frame.size.width dovrebbe mi hanno dato 300.

Invece mi ha dato 46.

Approccio 2

Questa era la mia work-around:

viewDidLoad:

let screenSize: CGRect = UIScreen.mainScreen().bounds 
    helpButHeight.constant = screenSize.width - 100 

perchè 100 = 50 + 50, i due margini.

Funziona bene!

Domanda

Perché ho dovuto fare questo? Perché il primo approccio non ha funzionato? Perché 46 e non 300?

+0

Stai facendo questo 'helpButHeight.constant = helpBut.frame.size.width' nel tuo' viewDidLoad'? –

+0

sì, mi dispiace, lo renderò chiaro –

+0

Cosa non hai appena impostato Aspect Ration su 1: 1 e poi hai impostato i vincoli iniziali e finali a 50, e puoi centrarlo verticalmente? – EridB

risposta

14

Il motivo è che i vincoli non sono stati avviati, nella funzione viewDidLoad. Il ciclo di vita simile a

  • viewDidLoad - I vincoli non hanno fissato
  • viewWillAppear - I vincoli non hanno fissato
  • viewWillLayoutSubviews - I vincoli sono la creazione
  • viewDidLayoutSubviews - I vincoli sono impostati
  • viewDidAppear - I vincoli sono impostati
+0

Grande, quindi dovrei sostanzialmente spostare il mio codice in 'viewDidLayout' –

+0

sì, quello sarebbe uno dei posti corretti. –

+0

Tranne che si chiama 'viewDidLayoutSubviews' –

0

Se vuoi che qualsiasi vista sia al centro basta mettere il vincolo del centro orizzontale/verticale ... Nessun codice richiesto .. Se vuoi avere il padding basta mettere i vincoli sinistro e destro ... Solo per ricordarti di non usare entrambi insieme ... Si romperà ...

Problemi correlati