2015-09-21 6 views
6

Come riscrivere formato visivoAuto Layout: layoutMarginsGuide

addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-[label]-|", options: .AlignAllBaseline, metrics: nil, views: ["label": label])) 
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[label]-|", options: .AlignAllCenterX, metrics: nil, views: ["label": label])) 

spostando alle guide di layout (con margini)?

ho provato con

label.topAnchor.constraintEqualToAnchor(layoutMarginsGuide.topAnchor).active = true 
label.leftAnchor.constraintEqualToAnchor(layoutMarginsGuide.leftAnchor).active = true 
label.bottomAnchor.constraintEqualToAnchor(layoutMarginsGuide.bottomAnchor).active = true 
label.rightAnchor.constraintEqualToAnchor(layoutMarginsGuide.rightAnchor).active = true 

ma non funziona. Anche layoutMarginsGuide.layoutFrame non ha un valore previsto (sì, lo chiamo in layoutSubviews dopo l'esecuzione di super). I vincoli sono impostati, ma agisce come se ci fosse margine zero. Disegna e fornisce layoutFrame previsto solo quando il margine di layout è impostato su negativo; che non è quello che voglio ovviamente, ma dimostra che i vincoli sono impostati con le guide dei margini. Sembra che manchi qualcosa ...

risposta

11

Mi sembra che layoutMarginsGuide non sia pronto nel metodo init di un UIView. Ricevo anche problemi simili, dove l'impostazione dei vincoli in updateConstraints funziona correttamente. Ancora indagando sul perché.

AGGIORNAMENTO: Quello che stavo cercando di fare era impostare il layoutMargins prima che la vista fosse stata aggiunta a una superview (nella init). Non ha funzionato. Ciò che ha funzionato è stata l'impostazione dei vincoli in init, relativamente a layoutMarginsGuide, ma in realtà l'impostazione di layoutMargins in viewDidMoveToSuperView.

+1

Se trovi qualcosa, per favore condividi. –

+0

aggiornato con i miei risultati – midas06

+0

Ok ... bella cattura, ma questo non ha senso per me. Inoltre, i nuovi 'layoutMargins' devono differire in valore. Lo stesso problema qui: https://forums.developer.apple.com/it/message/93313. Sembra essere un bug. –

4

Ho fatto qualche altra ricerca sulle che, dal momento che ora abbiamo iOS 10. Ecco cosa ho trovato:

  • Si continua a non funzionare in modo affidabile. Intendo impostare i vincoli relativi alla guida dei margini di layout in un inizializzatore designato senza ulteriori azioni.
  • Funziona bene se la dimensione della cornice> = margini di layout per dimensioni particolari.
  • Altrimenti se si chiama layoutMarginsGuide (anche solo in print, stiamo ancora parlando di chiamate all'interno dell'inizializzatore) si corrompe questa guida in modo che anche in una chiamata successiva (in didMoveToWindow per esempio) non funzionerà quindi. Puoi ripararlo impostando il nuovo layoutMargins (ma il nuovo valore deve differire dal vecchio).

Considero questo un bug e lo archiviato (si prega di file anche così può essere la priorità per la correzione).

+0

Se puoi anche pubblicare il Radar su OpenRadar e menzionare qui il tuo numero Radar, è più facile per noi duplicarlo, e meno lavoro per i bip Apple per connettere i Radar tra loro. Grazie per aver postato questo, mi ha aiutato molto! – Whakkee