时间选择器

需要使用到循环列表:SuperScrollView.LoopListView2

UI界面代码:

using SuperScrollView;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIDate : MonoBehaviour
{

    public SuperScrollView.LoopListView2 YearLoopList;
    public SuperScrollView.LoopListView2 MonthLoopList;
    public SuperScrollView.LoopListView2 DayLoopList;
    public Button BtnLog;

    public Text TextDate;

    private string mCurYear = "";
    private string mCurMonth = "";
    private string mCurDay = "";


    // Start is called before the first frame update
    void Start()
    {
        InitAllYear();
        InitAllMonth();
        InitAllDay();

        BtnLog.onClick.AddListener(OnClickBtnLog);
    }

    private void OnClickBtnLog()
    {
        TextDate.text = $"{mCurYear}{mCurMonth}{mCurDay}";
    }

    #region
    private List<string> mAllYearList = new();
    private void InitAllYear()
    {
        int currentYear = System.DateTime.Now.Year;
        mAllYearList = new();
        mAllYearList.Add("");
        mAllYearList.Add("");
        for (int i = 0; i < 50; i++)
        {
            mAllYearList.Add($"{currentYear - i}年");
        }
        mCurYear = YearLoopList.ArrangeType switch
        {
            ListItemArrangeType.BottomToTop or ListItemArrangeType.RightToLeft => mAllYearList[^1],
            ListItemArrangeType.TopToBottom or ListItemArrangeType.LeftToRight => mAllYearList[0],
            _ => mCurYear
        };
        mAllYearList.Add("");
        mAllYearList.Add("");
        //默认值为第三个数
        mCurYear = mAllYearList[2];
        YearLoopList.InitListView(mAllYearList.Count, OnGetYearItemByIndex);
        YearLoopList.mOnSnapNearestChanged = OnYearSnapTargetChanged;
    }

    private void OnYearSnapTargetChanged(LoopListView2 listView, LoopListViewItem2 item)
    {
        int index = listView.GetIndexInShownItemList(item);
        if (index < 0)
        {
            return;
        }
        UIDate_DateItem itemScript = item.GetComponent<UIDate_DateItem>();
        if (!string.IsNullOrEmpty(mAllYearList[itemScript.mIndex]))
        {
            mCurYear = mAllYearList[itemScript.mIndex];
        }
        RefreshDay();
    }

    private LoopListViewItem2 OnGetYearItemByIndex(LoopListView2 listView, int index)
    {
        if (index < 0 || mAllYearList.Count == 0 || index >= mAllYearList.Count)
            return null;
        LoopListViewItem2 item = listView.NewListViewItem("DateItem");
        UIDate_DateItem script = item.GetComponent<UIDate_DateItem>();
        script.SetData(mAllYearList[index].ToString(), index);
        return item;
    }
    #endregion

    #region
    private List<string> mAllMonthList = new();
    private void InitAllMonth()
    {
        mAllMonthList = new();
        mAllMonthList.Add("");
        mAllMonthList.Add("");
        for (int i = 1; i <= 12; i++)
        {
            mAllMonthList.Add($"{i:D2}月");
        }
        mAllMonthList.Add("");
        mAllMonthList.Add("");
        //默认值为第三个数
        mCurMonth = mAllMonthList[2];
        MonthLoopList.InitListView(mAllMonthList.Count, OnGetMonthItemByIndex);
        MonthLoopList.mOnSnapNearestChanged = OnMonthSnapTargetChanged;
        

    }
    private void OnMonthSnapTargetChanged(LoopListView2 listView, LoopListViewItem2 item)
    {
        int index = listView.GetIndexInShownItemList(item);
        if (index < 0)
        {
            return;
        }
        UIDate_DateItem itemScript = item.GetComponent<UIDate_DateItem>();
        if (!string.IsNullOrEmpty(mAllMonthList[itemScript.mIndex]))
        {
            mCurMonth = mAllMonthList[itemScript.mIndex];
        }
        RefreshDay();
    }

    private LoopListViewItem2 OnGetMonthItemByIndex(LoopListView2 listView, int index)
    {
        if (index < 0 || mAllMonthList.Count == 0 || index >= mAllMonthList.Count)
            return null;
        LoopListViewItem2 item = listView.NewListViewItem("DateItem");
        UIDate_DateItem script = item.GetComponent<UIDate_DateItem>();
        script.SetData(mAllMonthList[index].ToString(), index);
        return item;
    }
    #endregion

    #region
    private List<string> mAllDayList = new();
    private void InitAllDay()
    {
        mAllDayList = new();
        mAllDayList.Add("");
        mAllDayList.Add("");
        for (int i = 1; i <= 30; i++)
        {
            mAllDayList.Add($"{i:D2}日");
        }
        mAllDayList.Add("");
        mAllDayList.Add("");
        //默认值为第三个数
        mCurDay = mAllDayList[2];
        DayLoopList.InitListView(mAllDayList.Count, OnGetDayItemByIndex);
        DayLoopList.mOnSnapNearestChanged = OnDaySnapTargetChanged;
        
    }

    private void RefreshDay()
    {
        int daysInMonth = 30;
        if (!string.IsNullOrEmpty(mCurYear) && !string.IsNullOrEmpty(mCurMonth))
        {
            int year = int.Parse(mCurYear.Replace("年", ""));
            int month = int.Parse(mCurMonth.Replace("月", ""));
            daysInMonth = DateTime.DaysInMonth(year, month);
        }
        mAllDayList = new();
        mAllDayList.Add("");
        mAllDayList.Add("");
        for (int i = 1; i <= daysInMonth; i++)
        {
            mAllDayList.Add($"{i:D2}日");
        }
        mAllDayList.Add("");
        mAllDayList.Add("");
        //默认值为第三个数
        mCurDay = mAllDayList[2];
        DayLoopList.SetListItemCount(mAllDayList.Count);
        DayLoopList.RefreshAllShownItem();
    }

    private void OnDaySnapTargetChanged(LoopListView2 listView, LoopListViewItem2 item)
    {
        int index = listView.GetIndexInShownItemList(item);
        if (index < 0)
        {
            return;
        }
        UIDate_DateItem itemScript = item.GetComponent<UIDate_DateItem>();
        if (!string.IsNullOrEmpty(mAllDayList[itemScript.mIndex]))
        {
            mCurDay = mAllDayList[itemScript.mIndex];
        }
    }

    private LoopListViewItem2 OnGetDayItemByIndex(LoopListView2 listView, int index)
    {
        if (index < 0 || mAllDayList.Count == 0 || index >= mAllDayList.Count)
            return null;
        LoopListViewItem2 item = listView.NewListViewItem("DateItem");
        UIDate_DateItem script = item.GetComponent<UIDate_DateItem>();
        script.SetData(mAllDayList[index].ToString(), index);
        return item;
    }
    #endregion
}

Item代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIDate_DateItem : MonoBehaviour
{
    public Text TextContent;

    public int mIndex;

    void Start()
    {
        // Code Here
    }

    public void SetData(string content, int index)
    {
        TextContent.text = content;
        mIndex = index;
    }


}

界面设置:
界面设置
效果展示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值