it-swarm.com.de

Kann nicht gleichzeitig Einschränkungen erfüllen, wird er versuchen, sich durch Aufheben der Einschränkung zu erholen

Unten ist die Fehlermeldung, die ich im Debug-Bereich erhalte. Es läuft gut und nichts ist falsch, außer dass ich diesen Fehler erhalte. Würde dies verhindern, dass Apple die App akzeptiert? Wie kann ich das beheben?

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.
125
Johnny Cox

Ich würde empfehlen zu debuggen und herauszufinden, welche Einschränkung "die, die Sie nicht wollen" ist. Angenommen, Sie haben folgendes Problem:

enter image description here

Immer besteht das Problem darin, folgende Einschränkungen und Ansichten zu finden.

Es gibt zwei Lösungen, wie das geht:

  1. DEBUG HIERARCHY ANZEIGEN _ ​​(Diesen Weg nicht empfehlen)

Da Sie wissen, wo Sie unerwartete Einschränkungen finden (PBOUserWorkDayHeaderView), gibt es eine Möglichkeit, dies ziemlich gut zu tun. Wir finden UIView und NSLayoutConstraint in roten Rechtecken. Da wir ihre id im Speicher kennen, ist das ziemlich einfach.

  • App mit Debug View Hierarchy stoppen:

enter image description here

  • Finden Sie den richtigen UIView:

enter image description here

  • Der nächste ist, NSLayoutConstraint zu finden, der uns wichtig ist:

enter image description here

Wie Sie sehen können, sind die Speicherzeiger gleich. Wir wissen also, was jetzt los ist. Zusätzlich finden Sie NSLayoutConstraint in der Ansichtshierarchie. Da es in der Ansicht ausgewählt ist, wurde es auch im Navigator ausgewählt.

enter image description here

Wenn Sie möchten, können Sie es auch mithilfe des Adresszeigers auf der Konsole ausdrucken:

(lldb) po 0x17dce920
<UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>

Sie können dasselbe für jede Einschränkung tun, die der Debugger auf Sie zeigt :-) Nun entscheiden Sie, was Sie damit tun sollen. 

  1. PRINT IT BETTER _ ​​(Ich empfehle wirklich diesen Weg, das ist Xcode 7)}

    • legen Sie für jede Einschränkung in Ihrer Ansicht einen eindeutigen Bezeichner fest:

 enter image description here

  • erstellen Sie eine einfache Erweiterung für NSLayoutConstraint:

Swift

extension NSLayoutConstraint {

    override public var description: String {
        let id = identifier ?? ""
        return "id: \(id), constant: \(constant)" //you may print whatever you want here
    }
}

ZIEL C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

-(NSString *)description {
    return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}

@end
  • baue es noch einmal, und jetzt hast du mehr lesbare Ausgaben für dich:

 enter image description here

  • sobald Sie Ihre id erhalten haben, können Sie sie einfach in Ihrem Find Navigator antippen:

 enter image description here

  • und finde es schnell:

 enter image description here

WIE FINDEN SIE DEN FALL EINFACH?

  • versuchen Sie, priority in 999 für eine gebrochene Einschränkung zu ändern.
237

Das Problem, das Sie haben, ist, dass die NSAutoresizingMaskLayoutConstraints nicht dort sein sollten. Dies ist das alte System von Federn und Streben. Führen Sie diese Methode für jede Ansicht aus, die Sie einschränken möchten:

[view setTranslatesAutoresizingMaskIntoConstraints:NO];
102
David Wong

Achtung, dass Sie nicht mehr als eine Einschränkung in dieselbe Richtung und denselben Typ verwenden.

Zum Beispiel: Vertikale Einschränkung für das Nachlaufen = 15 und eine andere ist> = 10.

Manchmal erstellt Xcode einige Einschränkungen, die Sie nicht bemerken. Sie müssen redundante Einschränkungen entfernen und die Protokollwarnung wird sicher verschwinden.

enter image description here

Darüber hinaus Sie können lesen und erkennen aus bestimmten Gründen, direkt aus dem Protokoll:

NSLayoutConstraint: 0xa338390 V: | - (15) - [UILabel: 0xa331260] (Namen: '|': UILabel: 0xa330270)>

Dies kann als Problem in der UILabel-Einschränkung gelesen werden. Die vertikale Einschränkung ist 15pt lang.

NSLayoutConstraint: 0x859ab20 H :-( 13) - | [UIView: 0x85a8fb0] ...

Dies wäre eine nachlaufende horizontale Einschränkung usw.

28
pedrouan

Ich hatte eine ganze Reihe dieser Ausnahmen. Der schnellste und einfachste Weg, um sie zu lösen, bestand darin, eindeutige Werte in den Ausnahmen zu finden, nach denen ich dann im Storyboard-Quellcode suchte. Dies hat mir dabei geholfen, die tatsächlichen Ansichten und Einschränkungen zu finden, die das Problem verursachen (ich verwende aussagekräftige userLabels für alle Ansichten, wodurch es sehr viel einfacher wird, die Einschränkungen und Ansichten zu verfolgen).

Mit den obigen Ausnahmen würde ich das Storyboard als "Quellcode" in xcode (oder einem anderen Editor) öffnen und nach etwas suchen, das ich finden kann ...

<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 

Dies sieht aus wie eine vertikale (V) -Einschränkung für ein UILabel mit einem Wert von (17).

Ich schaue auch durch die Ausnahmen 

<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>

Wie es aussieht, befindet sich das UILabel (0x72bf7c0) nahe an einem UIButton (0x886efe0) mit etwas vertikalem Abstand (8).

Das wird hoffentlich genug sein, um die spezifischen Ansichten im Storyboard-Quellcode zu finden (wahrscheinlich, indem der Text anfänglich nach "17" gesucht wird) oder zumindest nach einigen möglichen Kandidaten. Von dort aus sollte ich in der Lage sein, tatsächlich herauszufinden, welche Ansichten sich im Storyboard befinden, wodurch es einfacher wird, das Problem zu identifizieren (suchen Sie nach "doppeltem" Pinning oder Pinning, das Konflikte mit Größenbeschränkungen aufweist). 

6
C James

Ich hatte dieses Problem, da meine .xib-Dateien Autolayout verwendeten.

Im Dateiinspektor die erste Registerkarte. Das Deaktivieren von "Use Autolayout" löste das Problem.

autolayout file inspector

6

Es fiel mir schwer, herauszufinden, welche Einschränkungen diesen Fehler verursacht haben. Hier ist eine einfachere Möglichkeit, dies zu tun. 

Ich verwende Xcode 6.1.1

  1. "Befehl + A", um alle UILabels, UIImages usw. auszuwählen. 
  2. Klicken Sie auf Editor -> Pin> (Select ...) to Superview
  3. klicken Sie erneut auf Editor -> Automatische Layoutprobleme beheben -> Fehlende Einschränkungen hinzufügen oder Auf vorgeschlagene Einschränkungen zurücksetzen. Das hängt von Ihrem Fall ab.
6
Ronaldoh1

Hier ist meine Erfahrung und Lösung ... Ich habe keinen Code berührt

  1. Ansicht auswählen (UILabel, UIImage usw.)
  2. Editor> Pin> (Auswählen ...) an Superview
  3. Editor> Automatische Layoutprobleme beheben> Fehlende Einschränkungen hinzufügen
4
royemi

verwenden Sie Swift diesen Code

view.translatesAutoresizingMaskIntoConstraints = false
4
Arun Kumar P

Ich habe SO Fragen und Antworten jeder Suchanfrage gefolgt. Aber alle sind mit einem bestimmten verwandt.

Im Grunde meine ich, bevor Sie ein Format aufschreiben (es kann ein einfaches sein), wird es eine Warnung geben.

In iOS 8.0 sind Ansichten standardmäßig Größenklassen. Selbst wenn Sie Größenklassen deaktivieren, enthält es noch einige Einschränkungen für das automatische Layout.

Also, wenn Sie planen, Constrains über Code mit VFL zu setzen. Dann müssen Sie sich um eine unterste Zeile kümmern.

// Remove constraints if any.
[self.view removeConstraints:self.view.constraints];

Ich hatte viel in SO gesucht, aber die Lösung lag in Apple Sample Code

Sie müssen also die Standardeinschränkungen entfernen, bevor Sie neue hinzufügen möchten.

2
Kampai

Der Hauptgrund für dieses Problem war für mich, dass ich vergessen habe, AutoLayout im Xib-Editor zu deaktivieren. Tatsächlich habe ich viele Änderungen an XIB im Code vorgenommen.

1
giuseppe
 for(UIView *view in [self.view subviews]) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

Dies hat mir geholfen, die Ansicht zu erfassen, die das Problem verursacht.

1
Grant Carlisle

Keine der vorgenannten Antworten ist in meiner Situation hilfreich. Ich verwende XCode 10.1 und teste meine App auf dem Simulator für ein "iPad (5. Generation)". Der Simulator läuft mit iOS 12.1.

Ich habe in meinem Storyboard eine einfache Wurzelansicht mit zwei UITextField-Unteransichten. Im Storyboard werden überhaupt keine Einschränkungen verwendet. Und ich habe keine UIButtonBarView-Objekte in der App oder im Storyboard.

Beim Start der App werden keine Nachrichten gedruckt und die Root-Ansicht wird angezeigt. Keine, wenn das simulierte Gerät gedreht wird.

Aber im Simulator, sobald ich auf eines der Textfelder klicke, wird die Tastaturerweiterung am unteren Rand des Bildschirms angezeigt, wenn auch nicht die vollständige Tastatur, die im Simulator nie zu erscheinen scheint. Auf dem Terminal wird jedoch folgendes ausgedruckt:

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:0x6000034e7700 h=--& v=--& UIKeyboardAssistantBar:0x7f9c7d714af0.height == 0   (active)>",
"<NSLayoutConstraint:0x6000034aba20 V:|-(0)-[_UIUCBKBSelectionBackground:0x7f9c7d51ec70]   (active, names: '|':_UIButtonBarButton:0x7f9c7d51de40 )>",
"<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>",
"<NSLayoutConstraint:0x6000034fb3e0 V:|-(0)-[_UIButtonBarStackView:0x7f9c7d715880]   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034fb750 V:[_UIButtonBarStackView:0x7f9c7d715880]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034abc00 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f9c7d51de40.height == UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide'.height   (active)>",
"<NSLayoutConstraint:0x6000034d7cf0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>",
"<NSLayoutConstraint:0x6000034d7c50 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Es scheint mir sicher, dass dies alles mit nichts in meiner App zu tun hat und alles damit, wie Apple eine eigene Tastaturansicht erstellt, selbst wenn meine kleine Erweiterung damit erklärt ist.

Die Frage bleibt also: Gibt es etwas, für das ich als App-Entwickler verantwortlich bin (unter der Annahme, dass dies eine Menge Dinge ist, die es wert sind, daran teilzunehmen) oder ist es nur Apples eigenes Problem/Bug?

Bei der Simulation eines neueren iPad-Modells, z. B. des iPad Pro 12,9-Zoll (3. Generation), tritt diese Einschränkungsproblemmeldung nicht auf. Die Meldung wird jedoch angezeigt, wenn ein iPad Pro 9,7-Zoll-Modell simuliert wird. Alle behaupten, dass sie iOS 12.1 ausführen.

0
jsbox

Schnell 4

Ich füge diese Zeile einfach in viewDidLoad hinzu und arbeite gut mit mir.

view.removeConstraints(view.constraints)
0
Faris