Nie można jednocześnie zaspokoić ograniczeń - Brak ograniczeń

Przejrzałem i usunąłem każde ograniczenie użytkownika, ale nadal otrzymuję następujący błąd tylko po obróceniu urządzenia. Nie mam pojęcia dlaczego. Czy ktoś ma jakieś pomysły?

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.
Author: The Crazy Chimp, 0000-00-00

2 answers

Spójrzmy na nie jeden po drugim.

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

Mówi się, że widok 0xa330270 (A ) musi mieć wysokość 768 punktów.

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

To mówi, że widok 0xa331260 (B) dolna krawędź musi być szczeliną -1 od dołu A , czyli superview.

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

To mówi, że B górna krawędź musi być odstępem 841 punktów od górnej jej krawędzi, A .

Te trzy rzeczy nie mogą być prawdziwe - A nie może mieć wysokości 768 punktów i zawierać podzbiór z górną krawędzią 841 punktów wstawionych od góry i -1 punktów wstawionych od dołu. Gdzie zdefiniowałeś każde z tych ograniczeń?

Nie powiedziałeś, jaki układ próbujesz osiągnąć, ale wygląda na to, że możesz mieć maskę automatyzującą na superview, która zapobiega zmianie wysokości podczas obracania urządzenia. Z tego co wiem ograniczenia autoezakupowe pojawiają się tylko wtedy, gdy dodałeś widoki programowo, ponieważ storyboard lub xib jest albo autolayout, albo nie. Chyba, że robisz coś takiego jak dodawanie widoku Auto laid out (ładowanego z stalówki?) do innego widoku z nieautolayout stalówki?

 92
Author: jrturton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-14 21:56:15

Dzięki http://useYourLoaf.com dla tego kompletnego rozwiązania:

Http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html

Szybka porada, którą znalazłem zakopany w sesji WWDC 2015 na automatycznym układzie, który pomaga podczas debugowania problemów z ograniczeniami

Jeśli użyłeś układu Auto będziesz zaznajomiony z dziennikiem, który Xcode wypluwa, gdy coś się stanie. Aby utworzyć przykład zmodyfikowałem mój przykładowy Widok stosu kod i dodano ograniczenie do każdego z obrazów, aby dać im stałą szerokość 240(nie jest to dobry pomysł, jak zobaczymy).

Tutaj wpisz opis obrazka

Działa w widoku o zwykłej szerokości, takim jak iPad, ale jest zbyt szeroka dla widoku o kompaktowej szerokości, takiego jak iPhone w orientacji pionowej. Dziennik konsoli w czasie wykonywania nie jest przyjemny do odczytania. Pomijając tekst boilerplate otrzymujesz listę problematycznych ograniczeń:

"<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)]>"

Następnie dziennik informuje, które z powyższych ograniczeń zdecydował do przerwy:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>

Wyjście dziennika używa języka auto layout visual format, ale trudno jest wybrać moje ograniczenia z tych stworzonych przez system. Dzieje się tak zwłaszcza w przypadku widoków stosu, które z założenia mają tworzyć większość ograniczeń dla Ciebie. W tym trywialnym przykładzie znam ograniczenia stałej szerokości, które właśnie dodałem, ale trudno to zobaczyć z dziennika i im bardziej skomplikowany widok, tym trudniej się robi.

Dodawanie identyfikatora do ograniczenia

Dziennik staje się o wiele łatwiejszy do zrozumienia, jeśli dodasz identyfikator do każdego ograniczenia (NSLayoutConstraint ma właściwość identyfikatora od iOS 7). W interfejsie Builder znajdź ograniczenie

 12
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54