4

使用核心动画层,我一直在尝试实现以下功能。在包含超层中,有两个锚层,以及连接两者的另一个层。下图应该可以清楚地说明情况。在左侧,两个橙色锚点分别标记为“A”和“B”,绿线将它们连接起来。封闭层框架使用虚线显示。在右侧,显示了我当前实现的层层次结构,其中锚点和连接都是封闭超层的子层。连接的核心动画层方案

现在,我要做的是让锚点四处移动,并使连接保持连接状态。我目前正在利用连接层的-setFrame:方法更新其框架和路径属性,使用如下所示的代码:

- (void)setFrame:(CGRect)frame {

CGSize size = frame.size;
CGPoint startPoint = CGPointZero;
if (size.height < 0.0) startPoint.y -= size.height;

CGPathRef oldPath = self.path;
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, startPoint.x, startPoint.y);
CGPathAddLineToPoint(path, NULL, startPoint.x + size.width, startPoint.y + size.height);

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"];
animation.duration = [CATransaction animationDuration];
animation.timingFunction = [CATransaction animationTimingFunction];
animation.fromValue = (id)oldPath;
animation.toValue = (id)path;
[self addAnimation:animation forKey:@"pathAnimation"];

self.path = path;
CGPathRelease(path);
[super setFrame:frame];

}

现在,这种工作,但问题是帧(或位置+边界)动画不与路径动画同步运行,导致连接远端暂时分离的一些抖动效果(以及其他一些小问题,大概是由相同的核心问题引起的)。

我一直在玩弄这个问题,但只是为了适度的成功。在某一时刻,我将连接的框架设置为与封闭的超层的框架相同,这确实产生了预期的效果(因为现在框架不再需要动画了)。但是,我担心此解决方案在具有多个连接的上下文中的性能 - 即。多个不透明的大尺寸重叠层看起来很糟糕?

有人会有更好、更优雅的解决方案吗?谢谢!

4

2 回答 2

1

由于您只是真正拉伸(缩放)和旋转连接层,您是否考虑过对其应用转换而不是手动修改框架?

您应该能够根据锚层的位置使用一些基本的三角函数来计算旋转角度和比例因子。

于 2011-08-17T09:32:51.523 回答
0

由于您正在为路径而不是图层或路径的框架设置动画,因此您将在大约 10 分钟后遇到性能问题。50 个同步动画。由于 gpu 加速,只有在操作层隐式动画属性时,您才能获得高性能,因此是它的框架而不是它的内容(例如路径)。

于 2012-03-06T14:29:35.710 回答