You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.8 KiB
123 lines
2.8 KiB
2 years ago
|
using UnityEngine;
|
||
|
|
||
|
namespace UIWidgets {
|
||
|
/// <summary>
|
||
|
/// TileView ScrollRect fitter. Resize ScrollRect to fit whole number of items.
|
||
|
/// </summary>
|
||
|
[RequireComponent(typeof(ListViewBase))]
|
||
|
public class TileViewScrollRectFitter : MonoBehaviour {
|
||
|
ListViewBase tileView;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the TileView.
|
||
|
/// </summary>
|
||
|
/// <value>The TileView.</value>
|
||
|
public ListViewBase TileView {
|
||
|
get {
|
||
|
if (tileView==null)
|
||
|
{
|
||
|
tileView = GetComponent<ListViewBase>();
|
||
|
}
|
||
|
return tileView;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool isStarted;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The base size delta.
|
||
|
/// </summary>
|
||
|
protected Vector2 BaseSizeDelta;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The resize listener.
|
||
|
/// </summary>
|
||
|
protected ResizeListener ResizeListener;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Start this instance.
|
||
|
/// </summary>
|
||
|
public virtual void Start()
|
||
|
{
|
||
|
if (isStarted)
|
||
|
{
|
||
|
return ;
|
||
|
}
|
||
|
isStarted = true;
|
||
|
|
||
|
var scrollRect = TileView.GetScrollRect();
|
||
|
|
||
|
if (scrollRect!=null)
|
||
|
{
|
||
|
ResizeListener = scrollRect.GetComponent<ResizeListener>();
|
||
|
if (ResizeListener==null)
|
||
|
{
|
||
|
ResizeListener = scrollRect.gameObject.AddComponent<ResizeListener>();
|
||
|
}
|
||
|
|
||
|
BaseSizeDelta = (scrollRect.transform as RectTransform).sizeDelta;
|
||
|
|
||
|
ApplyFitter();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Add resize listener.
|
||
|
/// </summary>
|
||
|
protected void ResizeListenerOn()
|
||
|
{
|
||
|
ResizeListener.OnResize.AddListener(ApplyFitter);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Remove resize listener.
|
||
|
/// </summary>
|
||
|
protected void ResizeListenerOff()
|
||
|
{
|
||
|
ResizeListener.OnResize.RemoveListener(ApplyFitter);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Applies the fitter.
|
||
|
/// </summary>
|
||
|
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();
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// This function is called when the MonoBehaviour will be destroyed.
|
||
|
/// </summary>
|
||
|
public virtual void OnDestroy()
|
||
|
{
|
||
|
if (ResizeListener!=null)
|
||
|
{
|
||
|
ResizeListenerOff();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|