AutoLayout - Gleichmäßige Verteilung nur mit Constraints erreichbar?

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

  • AutoLayout - Gleichmäßige Verteilung nur mit Constraints erreichbar?

    Hallo,

    ich stelle gerade eine ältere App auf AutoLayout um und komme an einer Stelle nicht weiter:

    Eine View enthält 3 SubViews die übereinander gestapelt werden sollen:


    Brainfuck-Quellcode

    1. +------------------------+
    2. | +--------------------+ |
    3. | | Header | |
    4. | +--------------------+ |
    5. | +--------------------+ |
    6. | | Info | |
    7. | +--------------------+ |
    8. | +--------------------+ |
    9. | | Content | |
    10. | | | |
    11. | +--------------------+ |
    12. +------------------------+
    Alles anzeigen


    Das Problem:
    Die Info-View wird nur bei Bedarf eingeblendet und ansonsten entfernt. Ist die InfoView sichtbar sollen die drei Views sich die verfügbare Höhe zu 20/20/60% teilen. Ist die InfoView aber weg soll die Aufteilung 30/70% sein. Sowohl der Header als auch der Content sollen also einen Teil der vorherigen Info-Höhe erhalten. Das bekomme ich nicht hin.

    Die statischen Aufteilungen selbst sind kein Problem. Nur der Wechsel zwischen den beiden Varianten klappt nicht automatisch. Die verherige Info-Höhe komplett entweder dem Header oder dem Content zuzuschlagen ist auch kein Problem, aber die Aufteilung ist scheinbar schwieriger.
    Klar, beim Ausblenden der InfoView im Code könnte ich auch manuell Header und Content anpassen. Eleganter wäre aber eine automatische Lösung nur über Constraints. Geht das?
  • Wie genau meinst du das?

    Header.Bottom equal Info.Top
    Content.Top equal Info.Bottom

    Wenn man jetzt die die Höhe der InfoView auf 0 setzt um diese auszublenden bleibt die Headerview unverändert gleich groß und der Content bekommt die gesamte vorherige Info Höhe aufgeschlagen. Das soll ja gerade nicht passieren.
  • Agenor schrieb:

    Ganz ohne Code nur mit Constraints gibt es keinen vernünftigen Weg?


    Das ist doch nur mit Contraints...
    Wie willst Du das ohne Code hinkriegen? Wie soll das XIB entscheiden, ob der View da ist oder nicht. Du kannst ja auch einfach zwei XIBs erstellen, einmal mit und einmal ohne. Aber auch dann brauchst Du noch Code, nämlich wenn Du entscheidest, welches Du lädst.

    ciao

    gandhi
  • Agenor schrieb:

    OK, dass das geht ist klar. Ganz ohne Code nur mit Constraints gibt es keinen vernünftigen Weg?

    Nein, in der Regel leider nicht. In manchen Fällen kannst Du dem Autolayout noch durch zusätzliche Restriktionen; z. B. lineare Abhängigkeit der Höhen, minmale oder maximale Höhen noch etwas herauskitzeln. Das wird in der Regel aber sehr schnell sehr unübersichtlich.
    „Meine Komplikation hatte eine Komplikation.“
  • gandhi schrieb:


    Das ist doch nur mit Contraints...
    Wie willst Du das ohne Code hinkriegen? Wie soll das XIB entscheiden, ob der View da ist oder nicht. Du kannst ja auch einfach zwei XIBs erstellen, einmal mit und einmal ohne. Aber auch dann brauchst Du noch Code, nämlich wenn Du entscheidest, welches Du lädst.


    Ich meinte natürlich "nur im IB ohne zusätzlichen Code". Bei anderen Plattformen geht das auch ohne eine Zeile Code schreiben zu müssen, hätte ja sein können, dass Xcode da inszwischen etwas aufgeholt hat :)