2013-01-14 10 views
50

Ho esaminato e rimosso ogni singolo vincolo di utente ma sto ancora ricevendo il seguente errore SOLO dopo aver ruotato il dispositivo. Non ho assolutamente idea del perché. Qualcuno ha qualche idea?Impossibile soddisfare contemporaneamente i vincoli - Nessun vincolo in atto

2013-01-14 21:30:31.363 myApp[35869:c07] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>", 
    "<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270)>", 
    "<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270)> 

Break on objc_exception_throw to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
+0

Come avete impostato su questa vista - in codice, IB o un mix di entrambi? Puoi aggiornare la tua domanda per includerla? – jrturton

+0

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) –

+0

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) –

risposta

89

Diamo un'occhiata a questi uno per uno.

"<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>"

Questo sta dicendo vista 0xa330270 (A) deve essere alto 768 punti.

"<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270)>"

Questo è dire vista 0xa331260 (B) s 'bordo inferiore deve essere uno spazio di -1 dal fondo A, che è il suo superview.

"<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270)>"

Questo sta dicendo che bordo superiore s' B deve essere uno spazio di 841 punti dalla cima della sua superview, A.

Queste tre cose non possono essere tutte vere - A non può essere alto 768 punti e contenere una sottoview con un margine superiore di 841 punti all'interno del margine superiore e di -1 punti nella parte inferiore. Dove hai definito ciascuno di questi vincoli?

Non hai detto quale layout stai cercando di ottenere, ma sembra che tu possa avere una maschera autoresizzante sul superview che impedisce di cambiare in altezza quando ruoti il ​​dispositivo. Per quanto ne so, i vincoli di autorizzazione si visualizzano solo se sono state aggiunte le viste a livello di programmazione, dal momento che uno storyboard o xib è o completamente automatico, oppure no. A meno che non si stia facendo qualcosa come l'aggiunta di una visualizzazione automatica (caricata da un pennino?) A un'altra vista da un pennino non automatico?

+2

Si è scoperto che il limite di altezza era impostato così come un vincolo che lo diceva allungare per super vista. Per risolvere il problema, mi sono appena sbarazzato del vincolo di altezza. Grazie! –

+3

come sbarazzarsi del vincolo di altezza? Sto affrontando lo stesso problema. –

+2

C'è un modo per dire a quale vista 0xa331260, ad esempio, si riferisce effettivamente? – thumbtackthief

9

Immagino che questo non sia un errore comune, ma l'ho risolto un po 'in un modo tradizionale. Stavo ricevendo messaggi criptici come quello sopra. Per dare un senso a ciò, ho creato le classi di visualizzazione fittizia e l'ho allegato alle visualizzazioni nel mio storyboard. Ad esempio, se avessi un UIView, ho creato una classe chiamata AddressView e l'ho allegata a questa vista nella story board. È un po 'dispendioso in termini di tempo, ma ha funzionato per me. Dopodiché, anziché gli ID oggetto, ho ricevuto i nomi delle classi che mi hanno aiutato a individuare le opinioni che causavano il problema molto facilmente. Il mio messaggio di errore ora leggere,

2013-07-02 04:16:20.434 Myproject [2908:c07] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x9edeae0 V:|-(0)-[AddressView:0x143ee020] (Names: '|':MainView:0x129eb6a0)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x11e998c0 h=--& v=--& V:[MainView:0x129eb6a0(704)]>", 
    "<NSLayoutConstraint:0x156720b0 V:[AddressView:0x143ee020]-(896)-| (Names: '|':MainView:0x129eb6a0)>" 
) 

Qui si può vedere, i nomi delle mie opinioni MainView e vista Indirizzo stanno causando il problema.

Per risolvere il problema, ho semplicemente spostato la mia vista secondaria (in questo caso vista Indirizzo) e riposizionata di nuovo. Penso che il problema sia iniziato mentre stavo usando un mix di nuovo Layer automatico in Xcode 4.5 e vecchie competenze o posizionando manualmente le visualizzazioni.

In ogni caso, non sono sicuro se fosse più fortuna che diligenza, ma tuttavia questo potrebbe essere un modo diverso di debug. Forse questo aiuta qualcuno!

2

Ho risolto questo problema eliminando tutte le proprietà translatesizingMaskIntoConstraints dal file xib (Apri xib come codice sorgente).

+0

Può anche essere impostato nel codice self.dimmingView.translatesAutoresizingMaskIntoConstraints = NO – malhal

+1

Questo è ciò che ha risolto per me!Nel mio caso, l'impostazione 'translatesAutoresizingMaskIntoConstraints' su' YES' sembrava funzionare a livello di programmazione, ma stavo entrando nella console 'Incapace di soddisfare simultaneamente i vincoli '(anche se in realtà sembrava soddisfacente). Ho aperto come XML e ho visto un sacco di 'translatesAutoresizingMaskIntoConstraints =" NO "' (sospetto che sia il risultato della copia tra storyboard, solo uno dei quali ha attivato AutoLayout). Dopo aver rimosso quello dall'XML - non più avvisi! (In realtà non dovevo nemmeno fare nulla a livello di programmazione, "SÌ" è il valore predefinito). Grazie! –

11

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).

enter image description here

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):

enter image description here

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

2

Una nota. Si ottiene questo errore nei registri se si sta testando utilizzando una connessione di hotspot personale e la barra di stato dell'hotspot è in alto. Elimina i vincoli.

Spero che questo aiuti qualcuno .. mi stava facendo impazzire.

+1

Hey mtb, questo avviso dovrebbe essere gestito o è previsto? La mia app riesce a sembrare giusta e non so se dovrebbe essere riparata o ignorata? –

3

YourConstraintView.translatesAutoresizingMaskIntoConstraints = NO;

ha fatto per me.

3

Vale la pena conoscere le nozioni di base, e capire quello che Apple/Xcode sta cercando di dirti attraverso i registri

H = Horizontal constraint(for leading and Trailing) 
V = Vertical constraint(top and bottom edge) 
h = height 
w = width 

TopEdge -> V:|-(points)-[VIEW:memoryAddress] 
BottomEdge -> V:[VIEW:memoryAddress]-(points)-| 
Leading -> H:|-(points)-[VIEW:memoryAddress] 
Trailing -> H:[VIEW:memoryAddress] -(points)-| 
height  -> h= --& v=--& V:[VIEW:memoryAddress((points)] 
width  -> VIEW:memoryAddress.width == points 
between -> H:[VIEW 1]-(51)-[VIEW 2] 

Una volta capito questo, leggendo il vostro errore specifico è abbastanza facile

Problemi correlati