WoW-设置(和重置)框架锚点

问题描述 投票:0回答:1

我有一个非常简单的附加组件,它以文本形式显示四个信息,而不是以视觉表示形式-每个都在自己的框架上。用户可以自行决定是否关闭每个开关。

我希望这些框架都水平固定在一起。很容易吧?将Frame2的左边缘固定到Frame 1的右边缘,以相同的方式将其固定到Frame2,依此类推。如果禁用了Frame2,则需要将Frame3锚定到Frame1。

[我试图在锚点框架上运行Frame:GetChildren()来计数子代,并将它们锚定到锚点框架本身而不是彼此锚定,但是Frame:GetChildren()返回一个表表,而#运算符没有计数表。

作为奖励,我希望用户能够更改框架的顺序。

今天如何解决这个问题困扰着我整整一天。也许是缺乏睡眠,或者缺乏Lua经验。无论哪种方式,任何帮助将不胜感激。

lua world-of-warcraft
1个回答
0
投票

第一部分:组织框架

将不希望有的帧分配为接近零的宽度,其他所有帧都将改组。 (不要将width设置为正好为零,否则锚定的任何内容也会隐藏。)

function displayFrames(showFrame1, showFrame2, showFrame3, showFrame4)
    Frame1:SetWidth((showFrame1 and 300) or 0.0001)
    Frame1:SetShown(showFrame1)
    Frame2:SetWidth((showFrame2 and 300) or 0.0001)
    Frame2:SetShown(showFrame2)
    -- etc.
end

关于奖金,对帧重新排序,将所有帧相对于同一个父对象锚定(彼此相邻并手动计算x偏移:

Frame1:SetPoint("LEFT", UIParent, "LEFT", 0, 0)
Frame2:SetPoint("LEFT", UIParent, "LEFT", 300, 0)
Frame3:SetPoint("LEFT", UIParent, "LEFT", 900, 0)  -- will be right of Frame4
Frame4:SetPoint("LEFT", UIParent, "LEFT", 600, 0)

第二部分:GetChildren()返回值

GetChildren()返回多个值,每个值都是代表单个子代(即帧)的表。如果有四个孩子,那么您可以执行以下操作:

local child1, child2, child3, child4 = Frame:GetChildren()

如果您事先不知道有多少个子代,请考虑将所有值包装到一个表中以便可以对其进行迭代

local children = { Frame:GetChildren() }

for __, child in ipairs(children) do
   --do something to each child
end

由于您的目标是实际将每个帧锚定到上一个帧,except将第一个帧锚定到其他位置,因此您将需要使用其他类型的循环:

local children = { Frame:GetChildren() }

-- anchor the first frame if it exists
if (children[1]) then
    children[1]:SetPoint("CENTER", UIParent)
end

-- anchor any remaining frames
for i=2, #children do
    children[i]:SetPoint("LEFT", children[i-1], "RIGHT")
end
© www.soinside.com 2019 - 2024. All rights reserved.