--时间选择器
local DatePickerFrame = class("DatePickerFrame", require("core.common.BaseFrameNode"))
local resPath = "res/"
local DatePickerType = {
PickerDay = 1,
PickerMonth = 2,
PickerYear = 3,
}
function DatePickerFrame:ctor(data)
data = data or {}
local frameData = {
kSize = cc.size(display.width, 654),
closeCall = data.callBack
}
DatePickerFrame.super.ctor(self,frameData)
local date = os.date("*t",os.time())
self.year = date.year
self.month = date.month
self.day = date.day
self.yearDic = {}
for i=1900,self.year do
table.insert(self.yearDic, i)
end
table.insert(self.yearDic, 1, "")
table.insert(self.yearDic, table.nums(self.yearDic)+1, "")
self.monthDic = {"",1,2,3,4,5,6,7,8,9,10,11,12,""}
self.dayDic = {"",1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,""}
end
--[[
@desc: 根据年月,获取当月的天数
author:fang
time:2023-08-22 16:23:56
@return:
]]
function DatePickerFrame:getMaxDay()
local maxDay = 31
if self.month == 1 or self.month == 3 or self.month == 5 or self.month == 7 or self.month == 8 or self.month == 10 or self.month == 12 then
maxDay = 31
elseif self.month == 2 then
if self.year % 4 == 0 and self.year % 100 ~= 0 or self.year % 400 == 0 then
maxDay = 29
else
maxDay = 28
end
else
maxDay = 30
end
return maxDay
end
--[[
@desc:
author:fang 检查年月,日是否合理
time:2023-08-22 16:24:31
--@content:
--@i:
@return:
]]
function DatePickerFrame:checkDay(content,i)
local maxDay = self:getMaxDay()
if not content then
content = self.day
end
if not i then
i = self.day + 1
end
if content > maxDay then
local idx = i - (content - maxDay)
self.day = self.dayDic[idx]
self.dayPicker:jumpTo(idx)
local para = cc.p(self.dayPicker.innerContainer:getPosition())
self.dayPicker.changeMideItem(para)
else
self.day = content
end
end
function DatePickerFrame:initFrame()
local height = 870
local contentNode = UIHelper:createScale9InageView(resPath.."General_bg_white3.png",cc.size(display.width, height))
self:addChild(contentNode)
self.contentNode = contentNode
contentNode:setAnchorPoint(0,0)
contentNode:setPositionY(-height)
--"YEAR
local textYear = UIHelper:createSysFont(LanguageCfg.getTipString(968), 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
textYear:setPosition(96 + textYear:getContentSize().width/2, height - 84)
self:addToContentNode(textYear)
--"MONTH"
local textMonth = UIHelper:createSysFont(LanguageCfg.getTipString(967), 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
textMonth:setPosition(455 + textMonth:getContentSize().width/2, textYear:getPositionY())
self:addToContentNode(textMonth)
--"DAY"
local textDay = UIHelper:createSysFont(LanguageCfg.getTipString(969), 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
textDay:setPosition(self:getContentNodeSize().width - 101 - textDay:getContentSize().width/2, textYear:getPositionY())
self:addToContentNode(textDay)
self:createDayPicker(textDay:getPositionX())
self:createMonthPicker(textMonth:getPositionX())
self:createYearPicker(textYear:getPositionX())
local lineNode1 = UIHelper:createLine(cc.size(1000, 2), cc.c3b(0,0,0), cc.p(0.5,0.5))
self:addToContentNode(lineNode1)
lineNode1:setPosition(self:getContentNodeSize().width/2, self:getContentNodeSize().height-260)
lineNode1:setOpacity(25)
local lineNode2 = UIHelper:createLine(cc.size(1000, 2), cc.c3b(0,0,0), cc.p(0.5,0.5))
self:addToContentNode(lineNode2)
lineNode2:setPosition(self:getContentNodeSize().width/2, lineNode1:getPositionY()+150)
lineNode2:setOpacity(25)
local layout = UIHelper:createContentNode({size = cc.size(display.width, 80)})
layout:setAnchorPoint(0.5,0.5)
self:addToContentNode(layout)
layout:setPosition(self:getContentNodeSize().width/2, lineNode1:getPositionY()+290)
local layout = UIHelper:createContentNode({size = cc.size(display.width, 80)})
layout:setAnchorPoint(0.5,0.5)
self:addToContentNode(layout)
layout:setPosition(self:getContentNodeSize().width/2, lineNode1:getPositionY()-144)
local btnOk = UIHelper:createScale9InageView(resPath.."General_btn_huge_green.png", cc.size(1000, 110), 1)
local btnText = UIHelper:createSysFont(LanguageCfg.getTipString(311), 48, cc.c3b(255, 255, 255), FONT_TYPE.TITLE)
btnOk:addChild(btnText)
btnText:setPosition(btnOk:getContentSize().width/2,btnOk:getContentSize().height/2 + 4)
self:addToContentNode(btnOk)
btnOk:setPosition(self:getContentNodeSize().width/2,125)
UIHelper:addTouchEvent(btnOk, function()
self:closeFrame()
end, true)
self:onenFrame()
self:registerEventIsOut()
end
function DatePickerFrame:createDayPicker(posx)
self.dayPicker = self:createDatePicker(posx,self.dayDic,DatePickerType.PickerDay)
end
function DatePickerFrame:createMonthPicker(posx)
self:createDatePicker(posx,self.monthDic,DatePickerType.PickerMonth)
end
function DatePickerFrame:createYearPicker(posx)
self:createDatePicker(posx,self.yearDic,DatePickerType.PickerYear)
end
function DatePickerFrame:createDatePicker(posx,contentDic,pickerType)
local lv = require("core.utils.ListViewPro").new()
lv:setBounceEnabled(false)
lv:setContentSize(cc.size(150, 450))
lv:setBackGroundColorType(0)
lv:setBackGroundColor(cc.c3b(0, 100, 0))
lv:setAnchorPoint(0.5, 0.5)
self:addToContentNode(lv)
lv:setPosition(posx,self:getContentNodeSize().height/2 + 140)
local itemSize = cc.size(lv:getContentSize().width, 150)
local len = #contentDic
for i=1,#contentDic do
local layout = ccui.Layout:create()
local textId = UIHelper:createSysFont(contentDic[i], 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
layout:addChild(textId)
textId:setPosition(75, 75)
layout.textId = textId
layout:setContentSize(itemSize)
layout:setBackGroundColorType(0)
layout:setBackGroundColor(cc.c3b(math.random(1, 255),(math.random(1, 255)),(math.random(1, 255))))
lv:pushBackCustomItem(layout)
end
local innerSize = lv:getInnerContainerSize()
local pos = cc.p(lv.innerContainer:getPosition())
local listSize = lv:getContentSize()
local mathabs = math.abs
local changeMideItem
changeMideItem = function (para,eventType)
local idx = math.floor((innerSize.height + para.y) / itemSize.width + 0.5) - 1
if para.y == 0 then
idx = len - 1
end
if para.y == listSize.height - innerSize.height then
idx = 2
end
-- print("Idx"..idx)
local allItem = lv:getItems()
for i,v in ipairs(allItem) do
if mathabs(i - idx) < 5 then
if i == idx then
v.textId:enableBold(cc.size(1.2, 0))
v.textId:setColor(cc.c3b(0, 0, 0))
if eventType == "stop" then
local content = contentDic[i]
if pickerType == DatePickerType.PickerDay then
self:checkDay(content,i)
elseif pickerType == DatePickerType.PickerMonth then
self.month = content
self:checkDay()
elseif pickerType == DatePickerType.PickerYear then
self.year = content
self:checkDay()
end
end
else
v.textId:disableEffect()
v.textId:setColor(cc.c3b(159, 167, 173))
end
end
end
end
lv:registerLoadingEvent(function (eventType,para)
if eventType == "stop" then
local subPos = math.ceil(para.y) % itemSize.width
if mathabs(subPos) <= itemSize.width / 2 then
subPos = -subPos
else
subPos = itemSize.width - subPos
end
lv.innerContainer:runAction(cc.Sequence:create(cc.EaseSineOut:create(cc.MoveBy:create(0.2, cc.p(0, subPos))),
cc.CallFunc:create(function ()
local innerPosy = lv.innerContainer:getPositionY()
lv.innerContainer:setPositionY(math.ceil(innerPosy))
changeMideItem({x = para.x, y = innerPosy},eventType)
end)
))
elseif eventType == "scrolling" then
changeMideItem(para,eventType)
end
end)
performWithDelay(self, function ()
local off = 1
if pickerType == DatePickerType.PickerDay then
off = self.day + 1
elseif pickerType == DatePickerType.PickerMonth then
off = self.month + 1
elseif pickerType == DatePickerType.PickerYear then
off = table.nums(self.yearDic) - 1
end
lv:jumpTo(off)
local para = cc.p(lv.innerContainer:getPosition())
para.eventType = "stop"
changeMideItem(para)
end, 0.1)
lv.changeMideItem = changeMideItem
return lv
end
return DatePickerFrame
02-15