AutoLayout: UIView innerhalb von UIView hat falsche Rahmen
Arbeite ich mit AutoLayout im Storyboard, und alles schien in Ordnung. Allerdings, wenn ich eine UIView in einem anderen und gelten all die Einschränkungen, die ich möchte zu dem container und seinen Kindern, merke ich, dass der Rahmen falsch ist in viewDidLayoutSubviews:
. Anstatt den Rahmen würde ich erwarten, werden berechnet aufgrund meiner Einschränkungen, es ist etwas eklig mit großem Rahmen (wenn auch mit der richtigen Herkunft). Zum Beispiel, anstatt ein frame {{26, 10}, {444, 10}} bekomme ich so etwas wie {{0, 0}, {320, 568}}.
Seltsam genug, dieser nur passiert mit dem Kind UIView, wenn ich situieren es in einem anderen UIView, die hat einige Einschränkungen in Bezug auf seine superview (was ist die view-controller-view). Wie ich unter dem Eindruck, dass ich erwarte, dass meine Ansichten richtig verlegt nach meinen Einschränkungen in der Methode viewDidLayoutSubviews:
ich bin verwirrt, warum dies geschieht.
Bin ich irgendwelche falsche Annahmen? Ich würde es schätzen, wenn jemand helfen könnte mich in die richtige Richtung. Danke!
Hinweis: Dieses problem ist komplett behoben, wenn ich meine korrekte-frame-abhängige setup in viewDidAppear:
, aber das ist ein etwas unbefriedigender workaround für mich.
- Bitte prüfen :- stackoverflow.com/a/26859831/2522457
- Danke für Ihre Antwort. Ich bin eigentlich mit AutoLayout, aber so dass Sie es deaktivieren würde leider bei mir nicht funktioniert. Habe ich erwähnt, dass ich angewiesen bin auf eine korrekte frame an diesem Punkt, und das ist einfach, weil ich Sie ein paar einfache CAShapeLayer Zeichnungen innerhalb dieser Ansicht, deren frame der Ebene, erfordert die superview bounds-Eigenschaft korrekt zu sein
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auto-Layout-änderungen von Grenzen sind nicht unbedingt fertig in
-viewDidLayoutSubviews
. Wie in "Voraus" Auto-Layout "Toolbox":In der Dokumentation für
-viewDidLayoutSubviews
Notizen mit Schwerpunkt in der original:Also layout und constraint-basierte Iterationen in der Untersichten könnte sich weiter anpassen, Ihren Bildern, aber wenn Sie einen ViewController Sicht die Grenzen nicht ändern, seine
-viewWillLayoutSubviews
wird nicht aufgerufen.Da Sie sagen, dein setup ist "frame-abhängige" haben Sie ein paar Optionen.
-viewWillAppear
. Besser als-viewDidAppear
, und da müssen Sie wirklich alles getan werden, nachdem alle das layout, wenn abgeschlossen, aber bevor es auf dem Bildschirm erscheint, dies ist eine legitime Grund, warum die Methode ist es. Falls relevant, Sie könnten versuchen, den Aufruf-isMovingToParentViewController
wie beschrieben in Bestimmen, Warum Ein View Aussehen Geändert.
-layoutIfNeeded
auf die Ansichten, die Sie benötigen, um die richtigen Werte, wo Sie Sie benötigen. Denn dieser hat die layout-arbeiten, es ist teuer, und es könnte dazu führen, repetitive Arbeit, die geleistet wird oder sogar eine unendliche Schleife, wenn ausgelöst, während seine eigenen layout-Prozess. Aber es ist nützlich, wenn es erforderlich ist, um die Synchronisierung einiger Werte mit "Auto-Layout", so dass Sie verwendet werden können.Wenn dies nicht funktioniert, lassen Sie es uns wissen, es könnte zu tun haben mit der Art der Einschränkungen, die sich selbst oder etwas anderes. Die Auto-Layout-Iterationen kann schwierig sein, zu synchen. Viel Glück.
layoutIfNeeded
half in meinem Fall