1

我有一种情况,我有一个lockLocation true我需要递归地调整它的大小以及其中的所有对象。

我有问题 A. 或问题 B。

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

。如果我先设置孩子的矩形,然后设置父组的矩形会将孩子移动到错误的位置。

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

4

5 回答 5

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

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

于 2013-04-23T20:20:10.777 回答
0

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

于 2013-04-23T16:55:00.767 回答
0

当我制作一个小的 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
于 2013-04-23T12:53:36.487 回答
0

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

相反,我将所有对象的矩形设置为相对于组的矩形,例如始终具有 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
于 2013-04-24T08:35:25.910 回答
0

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

于 2013-04-23T16:31:23.513 回答