--[[ @description:可以自定义 二级选项卡item 样式的垂直TabBar @example: code: local test_tab_data = { ["_1"] = "主菜单", ["_1_1"] = "子菜单", } 或者 local test_tab_data = { ["_1"] = {name = "主菜单", ...(自定义数据)}, ["_1_1"] = {name = "子菜单", ...(自定义数据)}, } local call_back = function (index, sub_index) --回调函数 end self.verTabBar = UICusVerTabBar.New(self.scroll_content, Vector2(265, 590), item, co.TableXY(257, 75)) self.verTabBar:SetSubOffset(co.TableXY(2, 2)) self.verTabBar:SetPaddingTop(6) self.verTabBar:SetTabBars(test_tab_data, call_back) self.verTabBar:SetSelectTab(1, 2) ]] UICusVerTabBar = UICusVerTabBar or BaseClass() --[[ sizeDelta: 菜单大小 item: 自定义的二级选项卡item tab_btn_size: 一级选项卡的大小 padding_top: 一级选项卡顶部内边距 subCon_offset: 一级选项卡子内容偏移 ]] function UICusVerTabBar:__init(parent_wnd, sizeDelta, item, tab_btn_size, padding_top, tab_offset, subCon_offset) self.parent_wnd = parent_wnd self.btn_list = {} self.item = item self.tab_btn_size = tab_btn_size self.padding_top = padding_top or 0 self.offset = tab_offset self.subCon_offset = subCon_offset self:Load(sizeDelta) end function UICusVerTabBar:__delete() for i,v in ipairs(self.btn_list) do v:DeleteMe() v = nil end self.btn_list = {} destroy(self.scroll_view) end function UICusVerTabBar:Load(sizeDelta) self.scroll_view = UiFactory.createChild(self.parent_wnd, UIType.ScrollView, "bar_scroll") self.scroll_view.transform.anchorMax = Vector2(0, 1) self.scroll_view.transform.anchorMin = Vector2(0, 1) self.scroll_view.transform.pivot = Vector2(0, 1) self.scroll_view.transform.anchoredPosition = Vector2(0, 0) self.scroll_view.transform.sizeDelta = sizeDelta and sizeDelta or Vector2(202, 561) self.scroll_view_content = self.scroll_view.transform:Find("Viewport/Content") self.scroll_view_viewport = self.scroll_view.transform:Find("Viewport") self:InitEvent() end function UICusVerTabBar:InitEvent() end function UICusVerTabBar:SetTabBars(bar_list, call_back, select_anything, force_size) if bar_list == nil or TableSize(bar_list) == 0 then return end --先隐藏所有菜单 for i,v in ipairs(self.btn_list) do v:SetVisible(false) end for i = 1, TableSize(bar_list) do local index = "_" .. i if not bar_list[index] then break end local tab_btn = self.btn_list[i] if tab_btn == nil then tab_btn = UICusVerTabBtn.New(self.scroll_view_content, self.item, self.tab_btn_size, self.subCon_offset) self.btn_list[i] = tab_btn end tab_btn:SetTabDetail(bar_list, i, call_back, select_anything, force_size) tab_btn:SetSubOffset(self.offset) tab_btn:SetVisible(true) local function onBtnClickHandler(target) self:SetSelectTab(tab_btn.index) end if tab_btn.tab then AddClickEvent(tab_btn.tab, onBtnClickHandler,2) end end self:RefreshTabPos() end --更新tabBar的位置 function UICusVerTabBar:RefreshTabPos(index, sub_index) local gap = self.padding_top local btn_height for i,v in ipairs(self.btn_list) do btn_height = v.btn_height if v.show == true then local off = self.offset and (v:GetVisibleCount(true) - 1) * self.offset.y or 0 local h = v:GetVisibleCount(true) * self.item.Height + off v:SetPosition(0, -gap) gap = gap + v.btn_height + h else v:SetPosition(0, -gap) gap = gap + v.btn_height end end self.scroll_view_content.sizeDelta = Vector2(self.scroll_view_content.sizeDelta.x, gap) -- +40? if self.index and sub_index and sub_index >= 5 then local all_height = self.item.Height * 4 + (self.index - 1) * btn_height self.scroll_view_content.localPosition = Vector3(0,all_height,0) else self.scroll_view_content.localPosition = Vector3(0,0,0) end end --设置选中的选项卡 --[[function UICusVerTabBar:SetSelectTab(index, sub_index,force_show) self.sub_index = sub_index self.index = index for i,v in ipairs(self.btn_list) do -- if v.index and v.index == index then v:SetSelectMode(index, sub_index, force_show) -- end end GlobalEventSystem:Fire(EventName.TAB_BAR_BE_CLICK) self:RefreshTabPos() end--]] --设置选中的选项卡 function UICusVerTabBar:SetSelectTab(index, sub_index,force_show) for i,v in ipairs(self.btn_list) do if v.index and v.index == index then if not v.show then self:CancelSetSelectTab(index) end v:SetSelectMode(index, sub_index, force_show, self.quick_select) break end end self:RefreshTabPos(index, sub_index) end --取消所有的选中项 function UICusVerTabBar:CancelSetSelectTab(index) for i,v in ipairs(self.btn_list) do v:RefreshBtnState(false) v:SetSelectSubIndex(0, 0) end --self:RefreshTabPos() if index and index * UIVerTabSubBtn.Height > self.scroll_view.transform.sizeDelta.y / 2 then self.scroll_view_content.localPosition = Vector2(self.scroll_view_content.localPosition.x, (index - 1) * ComposeTabSubBtn.Height) else self.scroll_view_content.localPosition = Vector2(self.scroll_view_content.localPosition.x, 0) end end function UICusVerTabBar:SetScrollViewSize(width,heigh) self.scroll_view.transform.sizeDelta = Vector2(width,heigh) end function UICusVerTabBar:RefreshTabBtnState(index) for i,v in ipairs(self.btn_list) do if v.index == index then v:RefreshBtnState(v.show) end end self:RefreshTabPos() end function UICusVerTabBar:GetTabBtnShowState(index) for i,v in ipairs(self.btn_list) do if v.index == index then return v.show end end end --在回调函数中调用该函数,刷新选中状态 function UICusVerTabBar:UpdateSelectState(index, sub_index) for i,v in ipairs(self.btn_list) do v:SetSelectState(false) for key,value in ipairs(v.sub_btn_list) do value:SetSelectState(false) end end if sub_index == 0 then self.btn_list[index]:SetSelectState(true) else self.btn_list[index].sub_btn_list[sub_index]:SetSelectState(true) end end --传入主索引和所有要显示的子索引列表,取消红点只传入主索引 function UICusVerTabBar:ShowRedDot(index, index_list) if self.btn_list[index] and self.btn_list[index].ShowRedDot then self.btn_list[index]:ShowRedDot(index_list) end end