- Home /
Setting position based on size of elements on a layout group
I have a panel that has a Grid Layout Group. There are buttons as child of this panel, and their size is controlled by the Grid Layout. I want to have tooltips for these buttons, and I do that by instantiating a prefab from a script in the buttons. But then I want to set the position of those tooltips via code, to a specific position relative to the button size. The issue is that it seems the size of the buttons is not yet set in the Start() function, they get their width after some frames. So I have to do an ugly workaround for that, I wait for the size of the button to be set, and only then I set the position of my tooltips. Here's the script in the button that does that:
public void Start(){
tooltipClone = Instantiate (tooltipPrefab);
tooltipClone.transform.SetParent (this.transform);
tooltipClone.transform.localScale = Vector3.one;
StartCoroutine (SetTooltipPositionWhenRectIsReady ());
}
IEnumerator SetTooltipPositionWhenRectIsReady(){
while (this.rectTransform.rect.width == 0) {
yield return null;
}
//just two more frames to make sure
yield return null;
yield return null;
Vector3[] corners = new Vector3[4];
//order is: lowerLeft, upperLeft, upperRight, lowerRight
this.GetComponent<RectTransform>().GetWorldCorners(corners);
buttonWorldDimensions = new Vector2 (
corners [3].x - corners [0].x,
corners [1].y - corners [0].y
);
tooltipClone.transform.position = new Vector3 (
this.transform.position.x,
this.transform.position.y - buttonWorldDimensions / 2,
this.transform.position.z
);
}
So the question is: Is there any cleaner approach to do that? Because I don't feel like this is failproof.
Answer by SuperUltraHyper · Sep 13, 2015 at 02:06 PM
Having the same issue. I decided to look at the .tga dimensions to calc the sizes. The relevant code is:
Vector2 cpuSlotDimensions = new Vector2 (cpuSlot.GetComponent<Image>().sprite.rect.width, cpuSlot.GetComponent<Image>().sprite.rect.height);
processorPannel.GetComponent<RectTransform>().sizeDelta = new Vector2 (cpuSlotDimensions.x*details.processorColumnsSlots ,cpuSlotDimensions.y*details.processorRowSlots );
Your answer
Follow this Question
Related Questions
UI Vertical Layout Group with Content Size Fitter, how to set max width? 1 Answer
Change size of an UI object ( Javascript ( Unityscript) ) 0 Answers
4.6 UI.System: Triggering Layout Rebuild help 2 Answers
Tweening a RectTransform between AutoLayouts? 0 Answers
Retreive the Width Delta of a ContentSizeFitter game object 0 Answers