天津23维预案
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

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();
}
}
}
}