使子视图从"后面"另一个子视图

时间:2014-07-22 17:53:00

标签: ios animation subview

UISrollView中,我有几个以编程方式添加的子视图,表示树中的节点:

enter image description here

每个节点的框架包括节点本身以及将其连接到其父节点的线路。 (我这样做是为了方便节点的线条动画。)在下图中,绘制了一个节点的框架:

enter image description here

当用户点击其中一个节点时,两个子节点出现了#34;。我希望通过让子节点从父节点后面向下移动来为此设置动画。我的基本动画代码是:

- (void)descendFromParent
{
    // Do nothing if this is root node
    if (!self.parent)
        return;

    // Move node to parent location
    self.frame = CGRectMake(self.frame.origin.x + self.parent.nodeFrame.origin.x - self.nodeFrame.origin.x,
                            self.frame.origin.y + self.parent.nodeFrame.origin.y - self.nodeFrame.origin.y,
                             self.frame.size.width, self.frame.size.height);

    // Animate the move back to original location
    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:0
                     animations:^{
                         self.frame = self.trueFrame;
                     }
                     completion:nil];
}

nodeFrame是一个只包含视图圆形部分的框架。)

问题当然是,当子节点正在下降时,它(特别是线)在父节点的顶部和上方可见:

enter image description here

我已经尝试了很多不同的方法来完成这项工作 - 使用CGContextClip等等 - 但它们都不起作用,主要是因为drawRect:没有被调用在动画期间。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您可能需要查看UIView方法

  • -insertSubview:belowSubview:
  • -insertSubview:atIndex:
  • -sendSubviewToBack:

在您的情况下,您可以在添加后使用-sendSubviewToBack:将两个子视图发送到后台。或者,您只需使用-insertSubview:atIndex:添加它们,并提供0作为索引。

答案 1 :(得分:1)

我认为您的问题不在于如何在正确的视图层次结构中排列视图,而是以下内容:

将子磁盘安排在父磁盘后面时,您希望它们向下滑动,当它们滑动时,连接其中心的边应该具有第一个零长度(当所有3个磁盘位于同一位置时) ,然后应该延长,直到最后达到最终长度。

如果是这种情况,一种可能的解决方案是:

让我们调用一个磁盘(0,0)的初始x,y中心坐标和最终坐标(X,Y)。使用通常的动画代码,可以很容易地在时间t将子中心移动到(X,Y) 现在假设您有一个额外的图像视图,显示沿对角线的边缘。在最终位置,“边缘视图”的中心位于(X / 2,Y / 2),其大小为(X,Y)。如果此视图放在所有其他视图后面,它将在最终位置连接两个磁盘 动画现在包括1)将中心属性从初始位置(0,0)更改为(X / 2,Y / 2),以及2)更改视图的比例(使用其transform property)零到最终尺寸,也在时间t 这应该做到。

答案 2 :(得分:0)

您可以为子视图指定索引,尝试插入要在索引0处设置动画的节点,并使蓝色节点的索引更高。