UIViewController layout vor der Anzeige

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

  • UIViewController layout vor der Anzeige

    Hallo Entwickler,

    ich nutze in meiner App Auto-Layout, um die Views auszurichten. Für die iPhone Version verwende ich ein anderes Set von Constraints.
    Leider sieht man während der push Animation, wie sich die Views ausrichten, also quer über den Bildschirm an ihren richtigen Platz fliegen.

    Wie kann ich meinen ViewController dazu bringen, die Views vor der Anzeige (in viewDidLoad) und ohne Animation auszurichten?
    Folgendes habe ich schon erfolglos probiert: [self.view layoutSubviews], [self.view layoutIfNeeded], [self.view seedNeedsDisplay], [self.view setNeedLayout].

    Danke im Voraus.
  • Ich mache meine Layout Anpassungen in viewWillAppear.
    UIViews werden nicht immer neu geladen, man kann eine komplette UIView Hierarchie auch cachen.

    Nur wenn self.view im UIViewController nil ist, werden viewWillLoad, loadView and viewDidLoad aufgerufen.

    Andererseits werden viewWillAppear und viewDidAppear immer dann aufgerufen wenn der UIViewController und damit die UIView's im aktuellen Window sichbar werden.

    Du kannst, wie der UINavigationController es ja auch macht, etliche UIViewController selbst verwalten, die alle den "load" lifecycle durchlaufen, aber den "appear" lifecycle nur aufrufen wenn sie dargestellt werden.

    Im Gegensatz zur gängigen Meinung, dass man soviel Speicher wie möglich sparen soll, sind UIViewController und UIView Instanzen sehr klein.
    Das Problem ist der CALayer Backingstore und die Logik der "draw" aufrufe (drawRect, drawLayer:inContext, usw.) die den Speicher verbrauchen.

    Ich habe mich lange mit CALayer Instanzen und CoreGraphics beschäftigt. Man kann wortwörtlich hunderte und tausende UIView und CALayer verwalten, wenn man sich darüber klar wird wann und wo der eigentliche content gerastert wird.
  • Vyax schrieb:

    Ich weiß nicht mehr weiter, selbst [self.view setNeedsUpdateConstraints] funktioniert nicht.

    Willst Du die Constraints oder das Layout aktualisieren? Kannst Du das Problem nicht an einem Beispielprojekt illustrieren?

    AppleDeveloper schrieb:

    Und was ist, wenn du für iPhone und iPad ein extra Storyboard machst? Dann erübrigt sich das Problem von selbst und das ist wohl die eleganteste Methode.

    Das löst weder das Problem noch ist es elegant; insbesondere da Apple inzwischen den entgegengesetzten Weg beschreitet.
    „Meine Komplikation hatte eine Komplikation.“
  • AppleDeveloper schrieb:

    In Xocde 6 kann man aber für die verschiedenen Layout verschiedene Comstriants festlegen und muss somit nicht im Xocde rumhantieren sondern kann die alle im Storyboard setzten.

    Nein, Du kannst in Xcode 6 verschiedene Constraints für unterschiedliche Größenklassen festlegen. Schon jetzt gibt es pro Dimension weniger Größenklassen als tatsächliche Displaydimensionen.

    Apple geht weg von mehreren display-spezifischen Storyboards hin zu einem Storyboard für sehr wenige abstrakte Displaygrößen.
    „Meine Komplikation hatte eine Komplikation.“