在UISrollView
中,我有几个以编程方式添加的子视图,表示树中的节点:
每个节点的框架包括节点本身以及将其连接到其父节点的线路。 (我这样做是为了方便节点的线条动画。)在下图中,绘制了一个节点的框架:
当用户点击其中一个节点时,两个子节点出现了#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
是一个只包含视图圆形部分的框架。)
问题当然是,当子节点正在下降时,它(特别是线)在父节点的顶部和上方可见:
我已经尝试了很多不同的方法来完成这项工作 - 使用CGContextClip
等等 - 但它们都不起作用,主要是因为drawRect:
没有被调用在动画期间。
我该如何做到这一点?
答案 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处设置动画的节点,并使蓝色节点的索引更高。