Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011
Sign in to follow this  
3ncrypt0

Vertikales Menü zentrieren nach Sprachänderung

Recommended Posts

Hi zusammen,

ich habe heute in meiner App weitere Sprachen hinzugefügt. Mein Mainmenü in der ersten Scene ist horizontal mittig positioniert. Ändere ich die Sprache, so ändert sich auch die Länge der Navigationspunkte. Gibt es eine Möglichkeit, dass sich die Punkte immer mittig zentrieren?

Die Menüpunkte befinden sich in einer Vertical Layout Group. Die Punkte sind Buttons und dort drin ist das jeweilige TextObjekt. Oder muss ich die Ausrichtung via Script manuell mit vordefinierten Werten vornehmen, wenn sich die Sprache ändert?

5a09c16940ee6_Bildschirmfoto2017-11-13um16_54_52.thumb.png.efeb9ec9c6ec2340d9283cf2f41eb8e1.png5a09c167c28c2_Bildschirmfoto2017-11-13um16_55_37.thumb.png.37a8f7d25eed1aa70cc2af0db42c9f47.png

 

Danke und VG

Jochen

Share this post


Link to post
Share on other sites

Versuche mal das Scrollview-/das Scrollcontent-Objekt komplett von der linken zur rechten Seite zu ziehen und setze bei der VerticalLayoutGroup die ChildAlignment auf MiddleCenter. Das sollte eigentlich alle Elemente auf dem kompletten Bildschirm zentrieren.

Grüße, hankey.

edit: Erst lesen, dann kommentieren :D glaube das war von deiner Seite aus garnicht so gewollt. Glaube mit den Pivot-Punkten kannst du die Mitte der Objekte definieren, aber das sollte sich mit dem ändern des Textes ja nicht großartig ändern.

Share this post


Link to post
Share on other sites

Hi @hankey94, ChildAlignment der VerticalLayoutGroup sitzt auf TopCenter. Das Problem hier ist ja, dass sich das Parent RectTransform in der Breite anpassen muss.

Ich habe nun mal etwas getestet: LayoutGroup weg (sind nur 3 Buttons im Menu).

Wir die App gestartet bzw. die MenuScene geladen, so lese ich die gewählte CurrentLanguage aus den PlayerPrefs uns passe dementsprechend den Text in den Textfeldern an.

Dann habe ich mir eine MenuWidthFix Class geschrieben. Diese habe ich auf das Parent der Menupunkte gelegt - dort frage ich alle ChildTextComponents ab, lese die Breite aus (die Texte haben ein ContentSizeFitter, damit sich die Breite dem Inhalt anpasst) und die größte Breite setze ich dann auch als Breite auf das Parent. Der Pivot des Parents ist mittig gesetzt, die Menupunkte immer links. 

Fazit: Das Parent ist immer mittig positioniert in der Breite des breitesten Menupunktes. Die Menupunkte sitzen immer links - also dann auch mittig. Nur gibt es noch ein Problem.

Der FixClass:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MenuWidthFix : MonoBehaviour {

	public GameObject panel;
	[SerializeField]
	private float w = 0;

	void Start(){
		Invoke ("changeMenuWidth", .05f);
	}

	public void changeMenuWidth(){
		w = 0;
		Text[] textComponents = panel.GetComponentsInChildren<Text> ();

		foreach (Text t in textComponents) {
			if (t.GetComponent<RectTransform> ().sizeDelta.x > w) {
				w = t.GetComponent<RectTransform> ().sizeDelta.x;
			}
		}
		setWidth ();
	}

	void setWidth(){
		panel.GetComponent<RectTransform> ().sizeDelta = new Vector2 (w,295);
	}
}

Ich muss den changeMenuWidth zeitverzögert aufrufen, da ich sonst immer eine Breite von 0 auf den Text Objekte auslese.

Ändere ich die Sprache in der SettingsClass:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Settings : MonoBehaviour {

	public MenuWidthFix menuFix;

	public void ChangeLanguage(string key){
		PlayerPrefs.SetString ("CurrentLanguage", key);

		Text[] allTextAssets = FindObjectsOfType (typeof(Text)) as Text[];
		Debug.Log ("1");
		foreach (Text text in allTextAssets) {
			if (text.GetComponent<MultiText> () != null) {
				text.GetComponent<MultiText> ().reloadLanguage ();
				Debug.Log ("2");
			}
		}
		Debug.Log ("3");
		menuFix.changeMenuWidth ();
		StartCoroutine (changeWidth());
	}

	IEnumerator changeWidth(){
		yield return new WaitForSeconds(.1f);
		//menuFix.changeMenuWidth ();
	}
}

Muss ich den Aufruf der FixClass auch zeitverzögert durchführen - das ist strange. Ich habe mal ein paar Debug.Logs eingesetzt um zu schauen, wann was wann aufgerufen wird und eigentlich sollte es passen. Erst wenn alle Textfelder geändert sind, wird FixClass aufgerufen, trotzdem ließt diese noch die alten Breiten aus...

Die Funktion zeitverzögert aufzurufen, sieht total bekloppt aus... jemand eine Idee?

 

Danke und VG

 

EDIT:

Hier mal temporär ein Video, was ich meine:

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×