grazie a http://useYourLoaf.com per questa soluzione completa:
http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html
una punta rapida ho trovato sepolto in una sessione WWDC 2015 sul Layout automatico che aiuta quando il debug dei problemi con vincoli
Se hai usato il layout automatico e avrai familiarità con il log che Xcode sputa quando si sbaglia qualcosa. Per creare un esempio ho modificato my Stack View sample code e aggiunto un vincolo a ciascuna delle immagini per dare loro una larghezza fissa di 240 (non una buona idea come vedremo).
che opera in vista regolari larghezza come l'iPad, ma è troppo ampio per una vista di larghezza compatta come l'iPhone in modalità ritratto. Il log della console in fase di esecuzione non è divertente da leggere. Saltare il testo standard si ottiene un elenco dei vincoli problematici:
"<NSLayoutConstraint:0x7fc1ab520360 H:[UIImageView:0x7fc1ab532650(240)]>",
"<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>",
"<NSLayoutConstraint:0x7fc1ab545cc0 UIView:0x7fc1ab53d870.trailingMargin == UIStackView:0x7fc1ab53dae0.trailing>",
"<NSLayoutConstraint:0x7fc1ab545d10 UIStackView:0x7fc1ab53dae0.leading == UIView:0x7fc1ab53d870.leadingMargin>",
"<NSLayoutConstraint:0x7fc1ab54e240 'UISV-alignment' UIStackView:0x7fc1ab53dc70.centerX == UIStackView:0x7fc1ab531a10.centerX>",
"<NSLayoutConstraint:0x7fc1ab5167c0 'UISV-canvas-connection' UIStackView:0x7fc1ab531a10.leading == UIImageView:0x7fc1ab532650.leading>",
"<NSLayoutConstraint:0x7fc1ab54ad80 'UISV-canvas-connection' H:[UIImageView:0x7fc1ab537380]-(0)-| (Names: '|':UIStackView:0x7fc1ab531a10)>",
"<NSLayoutConstraint:0x7fc1ab5397d0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.leading == _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7fc1ab54a4a0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.centerX == UIStackView:0x7fc1ab53dc70.centerX>",
"<NSLayoutConstraint:0x7fc1ab54b110 'UISV-spacing' H:[UIImageView:0x7fc1ab532650]-(16)-[UIImageView:0x7fc1ab537380]>",
"<NSLayoutConstraint:0x7fc1ab548210 'UISV-spanning-boundary' _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading <= UIStackView:0x7fc1ab531a10.leading>",
"<NSLayoutConstraint:0x7fc1ab551690 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc1ab53d870(375)]>"
Il registro allora si dice che dei vincoli di cui sopra si è deciso di rompere:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>
L'uscita del registro utilizza il layout automatico linguaggio del formato visivo ma è difficile individuare i miei limiti rispetto a quelli creati dal sistema. Questo è specialmente il caso delle viste dello stack che sono progettate per creare la maggior parte dei vincoli per te. In questo banale esempio, so che i vincoli di larghezza fissa che ho appena aggiunto hanno rotto le cose ma è difficile vederlo dal registro e più complessa è la vista, più difficile diventa.
Aggiunta di un identificatore a un vincolo
Il registro diventa molto più facile da capire se si aggiunge un identificativo per ciascun vincolo (NSLayoutConstraint
ha avuto una proprietà identificatore dal iOS 7). In Interface Builder trovare il vincolo e aggiungere l'identificatore nel Attributi (sto usando $ come un prefisso/suffisso per farli risaltare nel registro):
Aggiornamento 18-Agosto-2015: Come indicato nei commenti, l'identificatore può essere modificato solo in Interface Builder che inizia con Xcode 7. Non è visibile in Xcode 6.4.
Se l'aggiunta del vincolo in codice:
constraint.identifier = "$HeartImageFixedWidth$"
E 'più complicato se si utilizza il linguaggio formato visivo che utilizza matrici di vincoli.Ad esempio, si consideri il frammento di codice Swift per creare un vincolo larghezza fissa per la visualizzazione dell'immagine cardiaca:
let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]",
options:[], metrics:nil, views:viewsDictionary)
Poiché heartWidth è un array di tipo [NSLayoutConstraint] modificando l'identificatore è un po 'più di lavoro:
for constraint in heartWidth {
constraint.identifier = "$HeartImageFixedWidth$"
}
heartImage.addConstraints(heartWidth)
Con identifica fissati per i miei vincoli è ora molto più facile trovarli nel file di registro (vedere le prime quattro righe):
"<NSLayoutConstraint:0x7f92a305aeb0 '$ContainerStackViewLeading$' UIStackView:0x7f92a3053220.leading == UIView:0x7f92a3052fb0.leadingMargin + 32>",
"<NSLayoutConstraint:0x7f92a305b340 '$ContainerStackViewTrailing$' UIView:0x7f92a3052fb0.trailingMargin == UIStackView:0x7f92a3053220.trailing + 32>",
"<NSLayoutConstraint:0x7f92a301cf20 '$HeartImageFixedWidth$' H:[UIImageView:0x7f92a3047ef0(240)]>",
"<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>",
"<NSLayoutConstraint:0x7f92a3060cc0 'UISV-alignment' UIStackView:0x7f92a30533b0.centerX == UIStackView:0x7f92a30472b0.centerX>",
"<NSLayoutConstraint:0x7f92a301c590 'UISV-canvas-connection' UIStackView:0x7f92a30472b0.leading == UIImageView:0x7f92a3047ef0.leading>",
"<NSLayoutConstraint:0x7f92a305f680 'UISV-canvas-connection' H:[UIImageView:0x7f92a304d190]-(0)-| (Names: '|':UIStackView:0x7f92a30472b0)>",
"<NSLayoutConstraint:0x7f92a3064190 'UISV-canvas-connection' UIStackView:0x7f92a3053220.leading == _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7f92a30415d0 'UISV-canvas-connection' UIStackView:0x7f92a3053220.centerX == UIStackView:0x7f92a30533b0.centerX>",
"<NSLayoutConstraint:0x7f92a305fa10 'UISV-spacing' H:[UIImageView:0x7f92a3047ef0]-(16)-[UIImageView:0x7f92a304d190]>",
"<NSLayoutConstraint:0x7f92a30508c0 'UISV-spanning-boundary' _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading <= UIStackView:0x7f92a30472b0.leading>",
"<NSLayoutConstraint:0x7f92a3063240 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f92a3052fb0(375)]>"
E 'anche molto più cle arer che dei vincoli del sistema ha scelto di rompere:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>
Aggiunta di identificatori di vincoli non è senza sforzo, ma può pagare la prossima volta che si deve ordinare attraverso il registro di debug di un layout complesso.
Ulteriori letture
Come avete impostato su questa vista - in codice, IB o un mix di entrambi? Puoi aggiornare la tua domanda per includerla? – jrturton
possibile duplicato di [Ottenere uno strano errore parlando dei vincoli in Xcode] (http://stackoverflow.com/questions/11664115/getting-weird-error-talking-about-constraints-in-xcode) –
La risposta chiara sui problemi dei vincoli è qui: [Incapace di soddisfare simultaneamente i vincoli, proverà a recuperare rompendo il vincolo] (http://stackoverflow.com/q/11664115/2725435) –