如何更改组的矩形而不更改其中对象的位置?

时间:2013-04-23 11:22:52

标签: livecode

我的情况是我有一个带有lockLocation true,我需要重新调整它以及递归中的所有对象。

我有问题A.或问题B。

A。如果我在其子项之前设置组的矩形,那么孩子们就会移动,所以我不能再使用他们的矩形作为计算新矩形的基础。

即可。如果我先设置子项的矩形,那么设置父组的矩形会将子项移动到错误的位置。

可能的解决方案 我唯一能想到的是计算一个从子对象的rect中减去的偏移量,并将其传递给递归处理程序。

5 个答案:

答案 0 :(得分:0)

当我制作一个小型的iOS screenwap调色板时,我做的是首先缩放组中的所有对象,然后缓冲组中控件的所有位置:

 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

答案 1 :(得分:0)

在尝试调整组矩形之前锁定消息 - 这将阻止组中的对象从您下方移出。

答案 2 :(得分:0)

您可以尝试在调整子对象大小之前将该组的boundingRect设置为true,然后在禁用boundingRect之前将该组的rect设置为其完整范围。

答案 3 :(得分:0)

这是我正在讨论的偏移方法。这有效。正如我所说,这是一个递归命令,因此它将以所有者的组偏移量发送给控件。我正在寻找其他答案,看看我是否可以更多地优化这一点,或者如果你的想法更好。

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为true时,当任何子控件调整大小或移动时,它会阻止组自动更新。

https://github.com/runrev/livecode/commit/28a93bbf93e96b19662c77ae09fd57f611073bc5

答案 4 :(得分:0)

如果使用对象的原始位置和对象来确定新的位置和对象,则会出现舍入错误,最终都会出错。这是几何管理器完全不可靠的原因之一。因此,我强烈反对你的解决方案,Monte。

相反,我会设置所有对象的相对于组的rects,例如总是有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