Apple/iOS treibt mich mal wieder in den Wahnsinn...

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Apple/iOS treibt mich mal wieder in den Wahnsinn...

    In meiner App erhalte ich unter iOS 7 die folgende Exception:

    Quellcode

    1. *** Assertion failure in -[UIView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8803
    2. *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after sending -viewDidLayoutSubviews to the view controller. MyViewController's implementation needs to send -layoutSubviews to the view to invoke auto layout.'
    Der Fehler tritt nur unter iOS 7 auf. Ok, jetzt könnte man natürlich einfach Apple like sagen die App benötigt dann halt iOS 8/9. Was interessieren mich alte iOS Versionen. :(

    Finde ich jedoch nicht so toll, diese Einstellung. Daher würde ich den Fehler gerne beseitigen falls möglich. Leider ist Xcode nicht gerade sehr hilfreich, da es mir keine weiteren Anhaltspunkte zur Lokalisierung des Problems liefert. Der Exception Breakpoint wird einfach ignoriert und meinen anderen Versuche einen passenden Breakpoint zu setzen waren leider auch nicht erfolgreich.

    Hat evtl. jemand einen Tipp für mich, wie ich einen passenden Breakpoint setzen kann bzw. das Problem lokalisieren kann?
  • Hm, ich konnte den Crash auf eine Anpassung eines Height Layout Constraint eines Views in viewDidLayoutSubviews eingrenzen. Dies scheint iOS 7 nicht zu mögen. Ist wohl ein Bug, da es unter iOS 8 problemlos funktioniert. Ich muss wohl auch bei kleineren Änderungen öfter unter iOS 7 testen, bevor ich dann nicht mehr erkenne, welche Änderung genau unter iOS 7 nicht funktioniert. :(

    Im viewDidLayoutSubviews setzte ich die Height eines Views per Constraint. Die Höhe wird vorher berechnet, weil in diesem View ein TablesView mit unterschiedlicher Anzahl an Zeilen angezeigt wird. Allerdings sollen die Zeilen im TableView nicht gescrollt werden können. Lässt sich die Höhe dieses Views evtl. auch über ein Constraint einstellen, welches die "Content" Höhe des TableViews berücksichtigt? Sprich, der TableView zeigt 3 Rows an und der View ist dann eben 3 * tableView.rowHeight hoch. Wenn ich in dem TableView jetzt 10 Rows anzeigen möchte, dann passt sich die Höhe des Views per Contraint automatisch auf 10 * tableView.rowHeight an.

    Die Lösung zur aktuellen Version, also der Berechnung und das Setzen des Height Layout Constraints in viewDidLayoutSubviews, ist übrigens ein [self.view layoutIfNeeded]

    Ok, hätte man auch drauf kommen können, allerdings hat es unter iOS 8 ohne funktioniert und daher habe ich [self.view layoutIfNeeded] nicht verwendet.

    Die xib für den Controller habe ich im Layout für das iPhone 6 erstellt, da ich hierfür die Layout Vorlagen vom Designer hatte. Ist ja eigentlich auch kein Problem mit Auto Layout.

    Ich finde es jedoch sehr verwunderlich, dass wenn viewDidLayoutSubviews aufgerufen wird, nur einige Views bereits auf die Größe z.B. des iPhone 5 Bildschirms angepasst sind und einige View noch die Breite für das iPhone 6, also 375 Pixel haben. Wenn der ViewController dann angezeigt wird, dann ist der View inkl. aller Subviews korrekt. D.h. nach viewDidLayoutSubviews passt iOS noch die fehlenden Subviews an.

    Was soll das? Ich hätte erwartet, dass in viewDidLayoutSubviews der view inkl. aller Subviews korrekt berechnet ist. Habe ich bei den Auto Layout Einstellen etwas vergessen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • MCDan schrieb:

    Hm, ich konnte den Crash auf eine Anpassung eines Height Layout Constraint eines Views in viewDidLayoutSubviews eingrenzen.
    Wenn du da Constrains setzt, muss das Auto-Layout-System noch mal alles durchrechnen.

    MCDan schrieb:

    Im viewDidLayoutSubviews setzte ich die Height eines Views per Constraint. Die Höhe wird vorher berechnet, weil in diesem View ein TablesView mit unterschiedlicher Anzahl an Zeilen angezeigt wird. Allerdings sollen die Zeilen im TableView nicht gescrollt werden können. Lässt sich die Höhe dieses Views evtl. auch über ein Constraint einstellen, welches die "Content" Höhe des TableViews berücksichtigt?
    Hast du mal versucht, die Höhe des Tableviews mit der Y-Position des unteren Randes der letzten Zelle zu verbinden? Dieser Wert sollte ja mit der Gesamthöhe der Zellen übereinstimmen. Wenn du die Zellen dynamisch anlegst, musst du dieses Constraint wahrscheinlich per Code immer mit der Zelle zusammen anlegen. Ich würde für diese Zelle einen eigenen Prototypen verwenden, damit die anderen Zellen ihn niemals wiederverwenden können.
    „Meine Komplikation hatte eine Komplikation.“