Poniżej znajduje się komunikat o błędzie, który otrzymałem w obszarze debugowania. Działa dobrze i nic się nie dzieje poza tym, że otrzymuję ten błąd. Czy to uniemożliwiłoby Apple zaakceptowanie aplikacji? Jak to naprawić?
2012-07-26 01:58:18.621 Rolo[33597:11303] 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:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>",
"<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>",
"<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>",
"<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>",
"<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>",
"<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>",
"<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>",
"<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>",
"<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>",
"<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>",
"<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>
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.
ios
objective-c
debugging
nslayoutconstraint
Johnny Cox
źródło
źródło
Odpowiedzi:
Poleciłbym debugowanie i znalezienie ograniczenia, które jest „tym, którego nie chcesz” . Załóżmy, że masz następujący problem:
Zawsze problem polega na tym, jak znaleźć następujące ograniczenia i widoki.
Istnieją dwa rozwiązania, jak to zrobić:
Ponieważ wiesz, gdzie znaleźć nieoczekiwane ograniczenia (PBOUserWorkDayHeaderView), istnieje sposób, aby zrobić to całkiem dobrze. Znajdźmy
UIView
iNSLayoutConstraint
w czerwonych prostokątach. Ponieważ znamy ich identyfikator w pamięci, jest to dość łatwe.Jak widać, wskaźniki pamięci są takie same. Więc wiemy, co się teraz dzieje. Dodatkowo można znaleźć
NSLayoutConstraint
w widoku hierarchii. Ponieważ jest zaznaczona w widoku, jest również wybierana w Nawigatorze.Jeśli potrzebujesz, możesz również wydrukować go na konsoli za pomocą wskaźnika adresu:
Możesz zrobić to samo dla każdego ograniczenia, które wskaże Ci debugger :-) Teraz zdecydujesz, co z tym zrobić.
DRUKUJ LEPIEJ (naprawdę polecam ten sposób, to jest Xcode 7)
NSLayoutConstraint
:SWIFT :
CEL C
id
możesz ją po prostu dotknąć w swoim nawigatorze wyszukiwania :JAK PROSTO NAPRAWIĆ TĘ SPRAWĘ?
999
dla zerwanego wiązania.źródło
Problem, który masz, polega na tym, że NSAutoresizingMaskLayoutConstraints nie powinno tam być. To jest stary system sprężyn i rozpórek. Aby się go pozbyć, uruchom tę metodę w każdym widoku, który chcesz ograniczyć:
źródło
Uważaj , aby nie używać więcej niż jednego wiązania w tym samym kierunku i typie.
Na przykład: ograniczenie pionowości dla końcowego = 15, a drugie to> = 10.
Czasami Xcode tworzy pewne ograniczenia, których nie zauważysz . Musisz pozbyć się zbędnych ograniczeń, a ostrzeżenie dziennika na pewno zniknie.
Dodatkowo możesz odczytać i wykryć pewne przyczyny, bezpośrednio z dziennika :
Możemy to odczytać jako problem w ograniczeniu UILabel, jest to wiodące ograniczenie pionowe o długości 15 punktów.
Byłoby to końcowe ograniczenie poziome itp.
źródło
Rzuciłem sporo tych wyjątków, najszybszym i najłatwiejszym sposobem ich rozwiązania było znalezienie unikalnych wartości w wyjątkach, których następnie szukałem w kodzie źródłowym scenorysu. Pomogło mi to znaleźć rzeczywisty widok (y) i ograniczenia (a) powodujące problem (używam znaczących userLabels na wszystkich widokach, co znacznie ułatwia śledzenie ograniczeń i widoków) ...
Tak więc, korzystając z powyższych wyjątków, otworzyłbym scenorys jako „kod źródłowy” w xcode (lub innym edytorze) i poszukałbym czegoś, co mogę znaleźć ...
.. to wygląda jak ograniczenie pionu (V) na UILabel o wartości (17).
Przeglądając wyjątki również znajduję
Wygląda jak UILabel (0x72bf7c0) jest zbliżony do UIButton (0x886efe0) z pewnymi odstępami w pionie (8).
Miejmy nadzieję, że to wystarczy, abym znalazł określone poglądy w kodzie źródłowym scenorysu (prawdopodobnie początkowo wyszukując w tekście „17”) lub przynajmniej kilku prawdopodobnych kandydatów. Stamtąd powinienem być w stanie dowiedzieć się, które widoki są w scenorysie, co znacznie ułatwi zidentyfikowanie problemu (poszukaj „zduplikowanego” przypinania lub przypinania, które jest sprzeczne z ograniczeniami rozmiaru).
źródło
Trudno mi było ustalić, jakie ograniczenia powodują ten błąd. Oto prostszy sposób na zrobienie tego.
Używam Xcode 6.1.1
źródło
Miałem ten problem, ponieważ moje
.xib
pliki korzystały z automatycznego układu.W inspektorze plików pierwsza zakładka. Odznaczenie opcji „Użyj automatycznego układu” rozwiązało problem.
źródło
UIImageView
zmieniła się. Musisz ponownie ustawić tę pozycję, programowo lub za pomocą Interface Builder.Oto moje doświadczenie i rozwiązanie. Nie dotknąłem kodu
źródło
użyj szybko tego kodu
źródło
Śledziłem pytania i odpowiedzi SO z każdego zapytania wyszukiwania. Ale wszystkie są powiązane z konkretnym.
Zasadniczo mam na myśli, że zanim zapiszesz format (może być prosty), wyświetli ostrzeżenia.
Od iOS 8.0 domyślnie widoki są klasami wielkości. Nawet jeśli wyłączysz klasy rozmiarów, nadal będzie zawierał pewne ograniczenia dotyczące automatycznego układu.
Więc jeśli planujesz ustawić ograniczenia za pomocą kodu używającego VFL. Następnie musisz zająć się jedną z poniższych linii.
Dużo szukałem w SO, ale rozwiązanie leżało w Apple Sample Code .
Dlatego musisz usunąć domyślne ograniczenia przed planowaniem dodania nowego.
źródło
Dla mnie głównym powodem tego problemu było to, że zapomniałem odznaczyć
AutoLayout
wXib
edytorze. W rzeczywistości zrobiłem wiele poprawekXIB
w kodzie.źródło
Pomogło mi to uchwycić widok powodujący problem.
źródło
Żadna z powyższych odpowiedzi nie jest pomocna w mojej sytuacji. Używam XCode 10.1 i testuję moją aplikację na symulatorze pod kątem „iPada (5. generacji)”. Symulator działa pod kontrolą systemu iOS 12.1.
Mam prosty widok główny w mojej planszy, z dwoma widokami podrzędnymi UITextField. W scenorysie nie ma żadnych ograniczeń. I nie mam obiektów UIButtonBarView w aplikacji ani w scenorysie.
Żadne wiadomości nie są drukowane po uruchomieniu aplikacji i przedstawia widok główny. Brak, gdy symulowane urządzenie jest obracane.
Ale w symulatorze w momencie, gdy kliknę na jedno z pól tekstowych, rozszerzenie klawiatury wyłania się z dołu ekranu, chociaż nie jest to pełna klawiatura, która nigdy nie pojawia się w symulatorze. Ale na terminalu jest drukowany:
Z pewnością wydaje mi się, że wszystko to nie ma nic wspólnego z moją aplikacją, a wszystko ma związek z tym, jak Apple tworzy własny widok klawiatury, nawet z moim małym rozszerzeniem zadeklarowanym jako z nim połączone.
Pozostaje więc pytanie, czy jest coś, za co jestem odpowiedzialny jako programista aplikacji (zakładając, że jest to kilka rzeczy, którymi warto się zająć), czy jest to tylko problem / błąd Apple?
FWIW, ten komunikat o problemie z ograniczeniami nie pojawia się podczas symulacji nowszego modelu iPada, takiego jak iPad Pro 12,9 cala (3. generacji). Ale komunikat pojawia się podczas symulacji iPada Pro 9,7 cala ”. Wszyscy twierdzą, że mają system iOS 12.1.
źródło
Otrzymuję ten sam błąd, ale tylko w określonym widoku, kiedy dotykam pierwszego pola tekstowego, a następnie następnego pola tekstowego w dół.
Piszę w SwiftUI na iOS 13.4
źródło
Otrzymywałem również ten sam problem z łamaniem ograniczeń w dzienniku, dla ViewCircle w xib. Prawie wypróbowałem wszystko wymienione powyżej i nic nie działało. Następnie próbowałem zmienić priorytet ograniczenia wysokości, które łamało się w dzienniku (potwierdzone przez dodanie identyfikatorów ograniczeń na xib) tutaj wpisz opis zdjęcia
źródło
Jedną rzeczą, na którą trzeba uważać (przynajmniej to mnie zaskoczyło) było to, że usuwałem ograniczenie ze złego widoku. Ograniczenie, które próbowałem usunąć, nie było dziecięcym ograniczeniem mojego widzenia, więc kiedy to zrobiłem
w rzeczywistości niczego nie usuwałam, bo musiałam zadzwonić
ponieważ ograniczenie było technicznie ograniczeniem rodzeństwa mojego punktu widzenia.
źródło
szybki 4
Po prostu dodaję tę linię w viewDidLoad i dobrze ze mną współpracuje.
źródło