Ich habe eine benutzerdefinierte UIView-Unterklasse, die über eine Schreibfeder initialisiert wird.
In -awakeFromNib
erstelle ich eine Unteransicht und versuche, sie in der Übersicht zu zentrieren.
[self setInteralView: [[UIView alloc] init]];
[[self internalView] addConstraint: [NSLayoutConstraint constraintWithItem: [self internalView]
attribute: NSLayoutAttributeCenterX
relatedBy: NSLayoutRelationEqual
toItem: self
attribute: NSLayoutAttributeCenterX
multiplier: 1
constant: 0]];
Dies bricht ab und verursacht die folgende Ausgabe:
2013-08-11 17:58:29.628 MyApp[32414:a0b] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2013-08-11 17:58:29.630 MyApp[32414:a0b] View hierarchy unprepared for constraint.
Constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
Container hierarchy:
<UIView: 0xc132a40; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0xc132bc0>>
View not found in container hierarchy: <MyView: 0xc1315a0; frame = (-128 -118; 576 804); layer = <CALayer: 0xc131710>>
That view's superview: <UIView: 0xc131a70; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xc131b50>>
quelle
Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want.
Und dann bricht es<NSLayoutConstraint:0x126ad4c0 UIView:0xadd2e20.centerX == MyView:0xadd19b0.centerX>
@"V:|[v]|"
? wie würde sich das auf eine Übersicht beziehen?[v]
Sie gibt Ihnen obere und untere Einschränkungen der Standardgröße zwischen[v]
den oberen und unteren Kanten und der Übersicht. Sie müssten es auch zur Übersicht hinzufügen, glaube ich.Für andere, die hierher kommen: Ich habe diesen Fehler erhalten, weil ich die Einschränkungen hinzugefügt habe, bevor ich die Unteransichten zur Hierarchie hinzugefügt habe.
quelle
constraintWithItem: youView
der Gegenstand nicht darin vorhanden!Kurze Antwort : Eltern- und Kinderansicht tauschen .
Angenommen,
self
die übergeordnete Ansicht:schlecht :
[subview addConstraint [NSLayoutConstraint constraintWithItem:self...
gut :
[self addConstraint [NSLayoutConstraint constraintWithItem:subview...
Schnell
Obj-C
quelle
Zusätzliche Tipps:
Ich habe eine neu entwickelte App, die unter iOS7 einwandfrei läuft, aber unter iOS8 die Fehlermeldung "Die Ansichtshierarchie ist nicht auf die Einschränkung vorbereitet" wird angezeigt.
In einem anderen Beitrag heißt es, dass die (Unter-) Ansichten hinzugefügt werden müssen, bevor Einschränkungen erstellt werden. Ich habe das getan, aber immer noch den Fehler bekommen.
Dann fand ich heraus, dass ich Einschränkungen unter - (void) viewDidAppear anstelle von viewDidLoad erstellen sollte
quelle
viewDidAppear()
Aufruf ist die Ansicht für den Benutzer bereits sichtbar. Wenn Sie Einschränkungen ändern, sollte dies vorher erfolgenviewWillLayoutSubviews()
. Mehr über den Lebenszyklus hier: medium.com/@SergiGracia/…Dies ist eine alte Frage, aber ich möchte diese Zeile aus den Dokumenten hervorheben:
Zumindest wird dadurch ein Fehlerpunkt behoben, da Sie sich nicht mehr darum kümmern müssen, addConstraint in der falschen Ansicht aufzurufen
quelle
In meinem Fall wurde es gelöst, indem die Stammansicht als Container mit Einschränkungen anstelle einer aktuell erstellten Ansicht verwendet wurde.
Ich meine, verwenden Sie inside viewController
view.addConstraints([leftConstraintImage, topConstraintImage])
anstattimageView.addConstraints...
quelle
Wie @CharlesA in seiner Antwort hervorhebt, besteht das Problem darin, dass sich die von Ihnen hinzugefügte Ansicht nicht in der richtigen Ansichtshierarchie befindet. Seine Antwort ist gut, aber ich werde einige Details für einen bestimmten Anwendungsfall erläutern, der dieses Problem für mich verursacht hat:
Dies geschah, als ich versuchte, einer Ansicht, deren Ansichtscontroller ich mit instanziiert hatte, Einschränkungen hinzuzufügen
instantiateViewControllerWithIdentifier
. Um das Problem zu lösen, habe ich verwendet[childViewController didMoveToParentViewController:self]
. Dadurch wurde die Ansicht in die Ansichtshierarchie aufgenommen, auf die durch meine Einschränkung verwiesen wurde.quelle
Fügen Sie zuerst Ihre Unteransicht und dann Ihre Einschränkungen wie folgt hinzu
quelle