Jump to content
Unity Insider Forum

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...