[英]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.