Auto Layout: zwei views horizontal zentrieren (ohne diese in ein view zu packen)

  • Amin Negm-Awad schrieb:

    Noch einmal:

    Letztlich geht es um die x-Position des rechten Buttons. Die ergibt sich aus etwas wie:

    Restplatz (den es zu verteilen gilt):

    Restplatz = (Superviewbreite - BreiteLinkerButton - BreiteRechterButton - Abstand) x 0,5
    Das ist uns allen klar. Nur jetzt übersetze diese Formel mal in einen oder mehrere NSLayoutContraint. Da wird's dann eng.

    Amin Negm-Awad schrieb:

    Hierin ist alles bis auf die Superviewbreite konstant.
    Du lokalisierst deine Programme nicht?
  • An beide ein Zitat :

    "Hierin ist alles bis auf die Superviewbreite konstant. Das kann ich also in eine Form

    Restplatz = f x Superviewbreite - k

    bringen."

    Die beiden Buttons haben 100, der Abstand ist 10.

    Dann erhalte ich

    linkerButtonX = (Superviewbreite - 100 - 100 - 10) x 0.5
    = 0.5 x Superviewbreite - 105

    Sieht für mich wie ein Constraint aus. Denn das hat die Form attr1 = f x attr2 + k;

    attr1. ist die X-Position des linken Buttons, f ist 0,5, attr2 ist die Breite des Superviews und k ist 105.

    Ich sehe immer noch kein Problem.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Michael schrieb:

    Amin Negm-Awad schrieb:

    Noch einmal:

    Letztlich geht es um die x-Position des rechten Buttons. Die ergibt sich aus etwas wie:

    Restplatz (den es zu verteilen gilt):

    Restplatz = (Superviewbreite - BreiteLinkerButton - BreiteRechterButton - Abstand) x 0,5
    Das ist uns allen klar. Nur jetzt übersetze diese Formel mal in einen oder mehrere NSLayoutContraint. Da wird's dann eng.

    Amin Negm-Awad schrieb:

    Hierin ist alles bis auf die Superviewbreite konstant.
    Du lokalisierst deine Programme nicht?
    Während gerade an dem Fenster gezogen wird, nur ganz, ganz, ganz selten.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Michael schrieb:

    Amin Negm-Awad schrieb:

    Noch einmal:

    Letztlich geht es um die x-Position des rechten Buttons. Die ergibt sich aus etwas wie:

    Restplatz (den es zu verteilen gilt):

    Restplatz = (Superviewbreite - BreiteLinkerButton - BreiteRechterButton - Abstand) x 0,5
    Das ist uns allen klar. Nur jetzt übersetze diese Formel mal in einen oder mehrere NSLayoutContraint. Da wird's dann eng.

    Amin Negm-Awad schrieb:

    Hierin ist alles bis auf die Superviewbreite konstant.
    Du lokalisierst deine Programme nicht?
    Während gerade an dem Fenster gezogen wird, nur ganz, ganz, ganz selten.
    Erstellst du für jede Sprache immer noch eigene xib-Files?
  • Ist doch gleichgültig, wie ich lokalisiere. Wenn das Fenster auf dem Schirm kommt, ist es lokalisiert. Dann kenne ich die Buttongrößen und die bleiben konstant.

    Daher ist es, wie bereits geschrieben, ganz einfach eine Formel mit einer Variablen und jeder Menge Konstanten auf die allgemeine Form eines Constraints zu bringen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Ist doch gleichgültig, wie ich lokalisiere. Wenn das Fenster auf dem Schirm kommt, ist es lokalisiert. Dann kenne ich die Buttongrößen und die bleiben konstant.
    Ok, dann musst du die Constraints erst zur Laufzeit setzen oder zumindest anpassen.

    Amin Negm-Awad schrieb:

    Daher ist es, wie bereits geschrieben, ganz einfach eine Formel mit einer Variablen und jeder Menge Konstanten auf die allgemeine Form eines Constraints zu bringen.
    Na wenn das so einfach ist, dann mach doch mal. ;)
  • macmoonshine schrieb:

    Michael schrieb:

    Ok, dann musst du die Constraints erst zur Laufzeit setzen oder zumindest anpassen.
    Damit ist das dann nur noch Layout ohne Auto. ;)
    Quatsch. Autolayout heißt nicht auto, weil es nicht im Code gesetzt wird, sondern weil bei Änderung der Fenstergröße automatisch alle Views anpasst.

    Sonst wäre die ASCII-Art für Autolayout kein Autolayout. Die wird nämlich immer vom Code aus verwendet.

    Mal ganz abgesehen davon, dass der Einwand bisher immer war, dass man das nicht in die Constraint-Forum bringen könnte. Ich nehme an, dass der sich nach Befragung eines Drittklässlers erledigt hat.

    (BTW: Ich würde für so etwas einfaches immer einen gemeinsamen Superview verwenden. Aber es ging um die Aussage, dass es nicht geht.)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Ich habe es oben gemacht.
    Wo? Du hast die theoretische Berechnung gemacht. Die ist kein Problem. Nun sei aber mal nicht so faul (wie du oben selbst sagtest :) ) und setze das mal praktisch um mit:

    Quellcode

    1. + (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c


    Amin Negm-Awad schrieb:

    Ja, ich muss es zur Laufzeit machen. Ist bei Constraints ja nun nicht gerade ungewöhnlich.
    Hmm, bei mir ist das eher die Ausnahme.
  • Michael schrieb:

    Amin Negm-Awad schrieb:

    Ich habe es oben gemacht.
    Wo? Du hast die theoretische Berechnung gemacht. Die ist kein Problem. Nun sei aber mal nicht so faul (wie du oben selbst sagtest :) ) und setze das mal praktisch um mit:

    Quellcode

    1. + (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c

    Amin Negm-Awad schrieb:

    Ja, ich muss es zur Laufzeit machen. Ist bei Constraints ja nun nicht gerade ungewöhnlich.
    Hmm, bei mir ist das eher die Ausnahme.
    Oben:

    Das meinst du nicht ernst, oder?

    CGFloat m = 0.5;
    CGFloat c = (-button1.width - button2.width - spacing) * m;

    Soll ich dir jetzt noch sagen, wie Outlets funktionieren?

    Unten:

    Die Ausnahme? Du meinst für Fälle, die sich nicht einfach im IB klicken lassen? Du meinst für Fälle, wie die des OP?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Quatsch. Autolayout heißt nicht auto, weil es nicht im Code gesetzt wird, sondern weil bei Änderung der Fenstergröße automatisch alle Views anpasst.
    Das habe ich auch nicht behauptet. Du musst die Constraints aber auch bei einer Änderung der Fenstergröße (insbesondere der Geräte-Rotation unter iOS) anpassen, und das ist dann nicht mehr auto.


    EDIT: Abgesehen davon berechnest du Abstände manuell. Auch das ist meiner Meinung nach schon nicht mehr so ganz Auto. ;)
    „Meine Komplikation hatte eine Komplikation.“

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

  • macmoonshine schrieb:

    Amin Negm-Awad schrieb:

    Quatsch. Autolayout heißt nicht auto, weil es nicht im Code gesetzt wird, sondern weil bei Änderung der Fenstergröße automatisch alle Views anpasst.
    Das habe ich auch nicht behauptet. Du musst die Constraints aber auch bei einer Änderung der Fenstergröße (insbesondere der Geräte-Rotation unter iOS) anpassen, und das ist dann nicht mehr auto.
    Wieso muss ich das anpassen? Es ist ein ganz normales Constraint, das genau so funktioniert wie auch ansonsten Constraints. Bei Rotation oder Veränderung der Fenstergröße ändert sich die Größe der Buttons nicht. Daher muss ich überhaupt nichts neu berechnen. (Es kann natürlich gewollte Fälle geben, wie auch ansonsten bei Constraints. Aber das ist dann ja ebenso dasselbe.)

    Der Unterschied zu dem was man im IB zusammen klickt ist doch nur, dass der Offset "ungewöhnlich" ist, weil er sich etwas komplizierter berechnet. Da jedoch die Parameter der Berechnung samt und sonders Konstanten sind, macht das keinen Unterschied.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Amin Negm-Awad ()

  • Michael schrieb:

    Und wo kommt da die Superviewbreite ins Spiel?

    Edit:
    Die Methode hat noch ein paar Parameter mehr. Welche Views, Attribute und Relation setzt du ein?
    Okay, wenn du nicht weißt, wie man Views und attribute bei den Constraints setzt, kann man natürlich auf den Gedanken kommen, dass du davon ausgehst, es ginge nicht. Ich kann dir einführende Literatur empfehlen. Vielleicht das hier:

    amazon.de/Mac-Programmierung-f…TF8&qid=1438348198&sr=1-2

    Wenn du einen konkreten Einwand hast. der mutmaßlich genau so falsch ist, wie deine bisherigen Einwände, dann äußere ihn. Sonst lass es bleiben.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • macmoonshine schrieb:




    EDIT: Abgesehen davon berechnest du Abstände manuell. Auch das ist meiner Meinung nach schon nicht mehr so ganz Auto. ;)
    Ich berechne überhaupt keinen Abstand manuell. Aber selbst, wenn ich ihn berechnen würde, was möglicherweise eleganter ist, ändert sich nichts daran, dass die Viewgrößen bei Änderung der Fenstergröße automatisch angepasst werden.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • macmoonshine schrieb:

    Amin Negm-Awad schrieb:

    Wieso muss ich das anpassen? Es ist ein ganz normales Constraint, das genau so funktioniert wie auch ansonsten Constraints.
    +klonk+ Groschen gefallen. ;)
    Stellt sich nur die Frage, warum er bei Apple nicht gefallen ist. Mutmaßlich haben die versucht, dass mit Swift zu implementieren und sind über der Frage verstorben, wie ich aus einem Attribut als String einen Funktionsaufruf mache. R.I.P.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Unter iOS funktioniert deine Lösung allerdings bei der View-Rotation nicht optimal, wenn die Buttons breiter als die View-Breite im Hochformat ist. Dann stehen die Buttons entweder im Hochformat über den Rand hinaus, oder die Texte sind im Querformat gekürzt.
    „Meine Komplikation hatte eine Komplikation.“
  • Amin Negm-Awad schrieb:

    Stellt sich nur die Frage, warum er bei Apple nicht gefallen ist.
    Ja, Layout-Constraints mit mehreren Variablen wären eine nette Sache, und der verwendete CSP-Solver sollte die auch beherrschen. Wahrscheinlich wollten sie die Klasse NSLayoutConstraint und den Interface-Builder einfach halten. ;)

    Amin Negm-Awad schrieb:

    Mutmaßlich haben die versucht, dass mit Swift zu implementieren
    Das ist meines Wissens in C++.
    „Meine Komplikation hatte eine Komplikation.“