using UnityEngine; namespace UIWidgets { /// /// TileView ScrollRect fitter. Resize ScrollRect to fit whole number of items. /// [RequireComponent(typeof(ListViewBase))] public class TileViewScrollRectFitter : MonoBehaviour { ListViewBase tileView; /// /// Gets the TileView. /// /// The TileView. public ListViewBase TileView { get { if (tileView==null) { tileView = GetComponent(); } return tileView; } } bool isStarted; /// /// The base size delta. /// protected Vector2 BaseSizeDelta; /// /// The resize listener. /// protected ResizeListener ResizeListener; /// /// Start this instance. /// public virtual void Start() { if (isStarted) { return ; } isStarted = true; var scrollRect = TileView.GetScrollRect(); if (scrollRect!=null) { ResizeListener = scrollRect.GetComponent(); if (ResizeListener==null) { ResizeListener = scrollRect.gameObject.AddComponent(); } BaseSizeDelta = (scrollRect.transform as RectTransform).sizeDelta; ApplyFitter(); } } /// /// Add resize listener. /// protected void ResizeListenerOn() { ResizeListener.OnResize.AddListener(ApplyFitter); } /// /// Remove resize listener. /// protected void ResizeListenerOff() { ResizeListener.OnResize.RemoveListener(ApplyFitter); } /// /// Applies the fitter. /// public virtual void ApplyFitter() { ResizeListenerOff(); var scrollRect = TileView.GetScrollRect(); var scrollRectTransform = scrollRect.transform as RectTransform; var size = scrollRectTransform.rect.size; size += BaseSizeDelta - scrollRectTransform.sizeDelta; var item_width = TileView.GetDefaultItemWidth(); var items_in_row = Mathf.Max(1, Mathf.FloorToInt(size.x / item_width)); var required_width = items_in_row * (item_width + TileView.GetItemSpacing()); if (size.x!=required_width) { scrollRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, required_width); } var item_height = TileView.GetDefaultItemHeight(); var items_in_column = Mathf.Max(1, Mathf.FloorToInt(size.y / item_height)); var required_height = items_in_column * (item_height + TileView.GetItemSpacing()); if (size.y!=required_height) { scrollRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, required_height); } ResizeListenerOn(); } /// /// This function is called when the MonoBehaviour will be destroyed. /// public virtual void OnDestroy() { if (ResizeListener!=null) { ResizeListenerOff(); } } } }