对象移动后的CALayer定位

时间:2011-09-07 15:33:00

标签: iphone objective-c uiimageview calayer caanimation

我使用图层属性为CAAnimation动画我的UIImageView,如下所示:

    [imageView.layer addAnimation:pathAnimation forKey:[NSString stringWithFormat:@"pathAnimation%@",objId]];

但是在我的动画结束时(在物体从原点移动之后),当我读取框架的X Y坐标或中心坐标时,它们看起来总是原始的,而不是对象移动到的那些。

如何读取图层的坐标,以便确定移动物体的正确位置?

这是我的代码:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];  
imageView.image = [UIImage imageNamed:@"banner1.jpg"];
imageView.animationDuration = 2;
imageView.animationRepeatCount = 0;
imageView.tag = 100000;

imageView.layer.frame = imageView.frame;

[self.view addSubview:imageView];   
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.duration = 2.0f;
pathAnimation.delegate=self;
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO; 
CGMutablePathRef pointPath = CGPathCreateMutable();
CGPathMoveToPoint(pointPath, NULL, 100, 100);
CGPathAddLineToPoint(pointPath, NULL, 300, 200);
CGPathAddLineToPoint(pointPath, NULL, 200, 150);
pathAnimation.path = pointPath;
CGPathRelease(pointPath);   
[imageView.layer addAnimation:pathAnimation forKey:@"pathAnimation"];
[imageView release];

2 个答案:

答案 0 :(得分:2)

如果为图层设置动画,则包含图层的视图将保留在同一位置,因此框架将保持不变。图层也有框架,边界和位置属性,因此请尝试读取图层的属性。

编辑:

我在CAKeyframeAnimation类参考中找到了以下解释。

  

在制作动画时,它会使用指定的插值计算模式更新渲染树中属性的值。

并且知道什么是渲染树,我在这里找到它。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/CoreAnimationArchitecture.html#//apple_ref/doc/uid/TP40006655-SW1

似乎值在渲染树中得到更新,并且渲染树与展示和私有不同,我们无法访问它。

以下是上述链接的最后一段。

  

在动画事务处理过程中,您可以查询CALayer的实例以查找其相应的表示层。如果您打算更改当前动画并希望从当前显示的状态开始新动画,这将非常有用。

基于此,可以根据您提供的路径计算图层的新位置,并相应地设置表示层框架属性。

如果您发现任何更新,请写在这里.....

答案 1 :(得分:1)

这是自我解释声明(CALayer.h):

返回包含所有属性的图层副本   在当前交易开始时,使用任何活动动画   应用。这给出了与图层版本非常接近的近似值   当前显示的。如果图层尚未返回,则返回nil   已经承诺了。

尝试以任何方式修改返回图层的效果是   未定义。

返回的sublayersmasksuperlayer属性   layer返回这些属性的表示版本。这个   进行只读层方法。例如,呼叫-hitTest:   在-presentationLayer的结果将查询演示文稿   层树的值。

- (id)presentationLayer;