Skip to content

Instantly share code, notes, and snippets.

@mjholtzem
Created February 8, 2020 21:42
Show Gist options
  • Save mjholtzem/10bca557b9f42bdd3ab323cb9b6d3491 to your computer and use it in GitHub Desktop.
Save mjholtzem/10bca557b9f42bdd3ab323cb9b6d3491 to your computer and use it in GitHub Desktop.
Unity ScrollRect extension method to help with "scroll to item if it's outside of the viewport
public static class ScrollRectExtensions
{
public static Vector2 GetContentPositionToClampChild(this ScrollRect instance, RectTransform child)
{
Canvas.ForceUpdateCanvases();
// 1----2
// | |
// | |
// 0----3
Vector3[] viewportCorners = new Vector3[4];
instance.viewport.GetLocalCorners(viewportCorners);
Vector3[] childCorners = new Vector3[4];
child.GetWorldCorners(childCorners);
for (int i = 0; i < childCorners.Length; i++)
childCorners[i] = instance.viewport.InverseTransformPoint(childCorners[i]);
Vector2 offset = Vector2.zero;
if(childCorners[0].y < viewportCorners[0].y)
offset.y = viewportCorners[0].y - childCorners[0].y;
else if(childCorners[1].y > viewportCorners[1].y)
offset.y = viewportCorners[1].y - childCorners[1].y;
if(childCorners[0].x < viewportCorners[0].x)
offset.x = viewportCorners[0].x - childCorners[0].x;
else if(childCorners[3].x > viewportCorners[3].x)
offset.x = viewportCorners[3].x - childCorners[3].x;
return (Vector2)instance.content.localPosition + offset;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment