繁体   English   中英

使子视图从另一个子视图“后面”降序

[英]make subview descend from “behind” another subview

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

在此处输入图片说明

每个节点的框架包括节点本身以及将其连接到其父节点的线。 (我这样做是为了便于对带有节点的线进行动画处理。)在下图中,为其中一个节点绘制了框架:

在此处输入图片说明

当用户点击节点之一时,两个子节点“出生”。 我想通过让子节点从父节点的后部向下下降来对此进行动画处理。 我的基本动画代码是:

- (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是仅包含视图的圆形部分的框架。)

当然,问题在于当子节点下降时,它(特别是该行)在父节点的上方和上方可见:

在此处输入图片说明

我尝试了许多不同的方法来实现此目的-使用CGContextClip等-但它们都不起作用,主要是因为在动画期间未调用drawRect:

我该如何进行这项工作?

您可能想看看UIView方法

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

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

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

将子磁盘布置在父磁盘后面之后,您希望它们向下滑动,并且在滑动时,连接它们中心的边缘应具有第一个零长度(当所有三个磁盘都在同一位置时),并且然后进行扩展,直到最终达到其最终长度。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM