@ maksymiukの答えは最も正しいものですが、 InverseTransformPoint() 関数のおかげでアンカー、ピボット、その他すべてを適切に考慮しているため、それでも私にとってはそのままでは機能しませんでした-垂直スクローラーの場合、それはX 位置も変更します。そのため、垂直スクロールまたは水平スクロールが有効になっているかどうかを確認し、有効になっていない場合は軸を変更しないように変更しました。
public static void SnapTo( this ScrollRect scroller, RectTransform child )
{
Canvas.ForceUpdateCanvases();
var contentPos = (Vector2)scroller.transform.InverseTransformPoint( scroller.content.position );
var childPos = (Vector2)scroller.transform.InverseTransformPoint( child.position );
var endPos = contentPos - childPos;
// If no horizontal scroll, then don't change contentPos.x
if( !scroller.horizontal ) endPos.x = contentPos.x;
// If no vertical scroll, then don't change contentPos.y
if( !scroller.vertical ) endPos.y = contentPos.y;
scroller.content.anchoredPosition = endPos;
}