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.