public static float GetHorizotalNormalizedPositionAt(this ScrollRect scrollRect, RectTransform target) { RectTransform view = scrollRect.viewport != null ? scrollRect.viewport : scrollRect.GetComponent <RectTransform>(); Rect viewRect = view.rect; Bounds elementBounds = target.TransformBoundsTo(view); float offset = viewRect.center.x - elementBounds.center.x; float scrollPos = scrollRect.horizontalNormalizedPosition - scrollRect.NormalizeScrollDistance(0, offset); return(Mathf.Clamp(scrollPos, 0f, 1f)); }
public static float GetTargetScrollValue(this ScrollRect scrollRect, RectTransform target) { var view = scrollRect.viewport != null ? scrollRect.viewport : scrollRect.GetComponent <RectTransform>(); var viewRect = view.rect; var elementBounds = target.TransformBoundsTo(view); var offset = viewRect.center.y - elementBounds.center.y; var scrollPos = scrollRect.verticalNormalizedPosition - scrollRect.NormalizeScrollDistance(1, offset); return(Mathf.Clamp(scrollPos, 0f, 1f)); }
/// <summary> /// Scroll the target element to the vertical center of the scroll rect's viewport. /// Assumes the target element is part of the scroll rect's contents. /// </summary> /// <param name="scrollRect">Scroll rect to scroll</param> /// <param name="target">Element of the scroll rect's content to center vertically</param> public static void ScrollToCeneter(this ScrollRect scrollRect, RectTransform target) { // The scroll rect's view's space is used to calculate scroll position var view = scrollRect.viewport != null ? scrollRect.viewport : scrollRect.GetComponent <RectTransform>(); // Calcualte the scroll offset in the view's space var viewRect = view.rect; var elementBounds = target.TransformBoundsTo(view); var offset = viewRect.center.y - elementBounds.center.y; // Normalize and apply the calculated offset var scrollPos = scrollRect.verticalNormalizedPosition - scrollRect.NormalizeScrollDistance(1, offset); scrollRect.verticalNormalizedPosition = Mathf.Clamp(scrollPos, 0f, 1f); }