我有一种情况,我有一个组,lockLocation true
我需要递归地调整它的大小以及其中的所有对象。
我有问题 A. 或问题 B。
A.如果我将组的矩形设置在它的孩子之前,那么孩子会移动,所以我不能再使用他们的矩形作为他们计算出的新矩形的基础。
乙。如果我先设置孩子的矩形,然后设置父组的矩形会将孩子移动到错误的位置。
可能 的解决方案我唯一能想到的就是计算从子对象的矩形中减去的偏移量,并将其传递给递归处理程序。
我有一种情况,我有一个组,lockLocation true
我需要递归地调整它的大小以及其中的所有对象。
我有问题 A. 或问题 B。
A.如果我将组的矩形设置在它的孩子之前,那么孩子会移动,所以我不能再使用他们的矩形作为他们计算出的新矩形的基础。
乙。如果我先设置孩子的矩形,然后设置父组的矩形会将孩子移动到错误的位置。
可能 的解决方案我唯一能想到的就是计算从子对象的矩形中减去的偏移量,并将其传递给递归处理程序。
这是我正在谈论的偏移方法。这行得通。正如我所说,这是一个递归命令,因此它被分配到具有所有者组偏移量的控件。我正在查看其他答案,看看我是否可以对此进行更多优化,或者您的想法是否更好。
command mAppScaleObject pScale,pGroupOffset
local tRect,tScaledPoints,tPoints,tMargins,tControlIDs,tTabStops,tResizeGroup
-- here groups complicate things because relocating them changes the rects of
-- their child objects. Let groups resize around objects if they are unlocked.
put the rect of the target into tRect
repeat with X=1 to 4
if X mod 2 = 0 then
put round((pGroupOffset["Y"]+item X of tRect)*pScale) into item X of tRect
else
put round((pGroupOffset["X"]+item X of tRect)*pScale) into item X of tRect
end if
end repeat
put word 1 of the target is "group" and the lockLocation of the target into tResizeGroup
if tResizeGroup then
add the left of the target-item 1 of tRect to pGroupOffset["X"]
add the top of the target-item 2 of tRect to pGroupOffset["Y"]
end if
if word 1 of the target is not "group" or tResizeGroup then
set the rect of the target to tRect
end if
编辑
我已经解决了这个问题,并提高了在引擎级别为组内对象设置大量属性的性能,现在使用新的组属性 lockUpdates。当 lockUpdates 为真时任何子控件调整大小或移动时,它会阻止组自动更新。
https://github.com/runrev/livecode/commit/28a93bbf93e96b19662c77ae09fd57f611073bc5
您可以尝试在调整子对象大小之前将组的 boundingRect 设置为 true,然后在禁用 boundingRect 之前将组的矩形设置为其完整范围。
当我制作一个小的 iOS 屏幕切换调色板时,我所做的是首先缩放组中的所有对象,然后缓冲组中控件的所有位置:
repeat with i = 1 to the number of controls of pObject
put the loc of control i of pObject into tArr[i]
end repeat
然后缩放组,最后重置所有控件:
if tArr is an array then
repeat with i = 1 to the number of elements in tArr
set the loc of control i of pObject to tArr[i]
end repeat
end if
如果您使用对象的原始位置和矩形来确定新的位置和对象,则会产生舍入错误,最终一切都会出错。这是几何管理器完全不可靠的原因之一。因此,我强烈建议您反对您的解决方案,蒙特。
相反,我将所有对象的矩形设置为相对于组的矩形,例如始终具有 16 像素的边距。可能,此解决方案不允许使用通用方法,这就是为什么我总是编写自己的脚本,这些脚本直接与控件对话:
put the rect of grp 1 into myRect
add 16 to item 1 of myRect
add 16 to item 2 of myRect
subtract 16 from item 3 of myRect
subtract 16 from item 4 of myRecy
set the rect of fld 1 to myRect
-- etc
在尝试调整组矩形大小之前锁定消息 - 这将防止组中的对象从您下方移出。