我有一个非常简单的附加组件,它以文本形式显示四个信息,而不是以视觉表示形式-每个都在自己的框架上。用户可以自行决定是否关闭每个开关。
我希望这些框架都水平固定在一起。很容易吧?将Frame2的左边缘固定到Frame 1的右边缘,以相同的方式将其固定到Frame2,依此类推。如果禁用了Frame2,则需要将Frame3锚定到Frame1。
[我试图在锚点框架上运行Frame:GetChildren()
来计数子代,并将它们锚定到锚点框架本身而不是彼此锚定,但是Frame:GetChildren()
返回一个表表,而#
运算符没有计数表。
作为奖励,我希望用户能够更改框架的顺序。
今天如何解决这个问题困扰着我整整一天。也许是缺乏睡眠,或者缺乏Lua经验。无论哪种方式,任何帮助将不胜感激。
将不希望有的帧分配为接近零的宽度,其他所有帧都将改组。 (不要将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()返回多个值,每个值都是代表单个子代(即帧)的表。如果有四个孩子,那么您可以执行以下操作:
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