private Vector3 GetCenteredContentPosition(RectTransform child, ScrollRect scrollRect)
{
Vector3[] viewportCorners = new Vector3[4];
RectTransform viewport = scrollRect.viewport;
viewport = viewport != null ? viewport : (RectTransform)scrollRect.transform;
viewport.GetWorldCorners(viewportCorners);
Vector3 centreWorldPos = ((viewportCorners[1] - viewportCorners[0]) / 2f) + viewportCorners[0];
float h = centreWorldPos.y - child.position.y;
Vector3 displacement = new Vector3(0, h, 0);
Vector3[] contentCorners = new Vector3[4];
scrollRect.content.GetWorldCorners(contentCorners);
if (contentCorners[1].y + displacement.y < viewportCorners[1].y)
{
displacement.y = viewportCorners[1].y - contentCorners[1].y;
}
else if (contentCorners[0].y + displacement.y > viewportCorners[0].y)
{
displacement.y = viewportCorners[0].y - contentCorners[0].y;
}
return scrollRect.content.position + displacement;
}