如何在特定索引处添加动画层

时间:2010-08-22 11:14:34

标签: objective-c core-animation

我将两个CAText图层添加到视图中并为其中一个设置动画。我想在另一个图层上方设置动画,但在动画完成之前,它不会在图层层次结构中正确定位。谁能看到我做错了什么?动画有效,它只是在'topcharlayer2'后面运行,直到动画结束。

- (CABasicAnimation *)topCharFlap
{
CABasicAnimation *flipAnimation;


flipAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
flipAnimation.toValue      = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(1.57f, 1, 0, 0)];
flipAnimation.fromValue    = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.0, 1, 0, 0)]; 
flipAnimation.autoreverses = NO; 
flipAnimation.duration     = 0.5f;
flipAnimation.repeatCount  = 10;


return flipAnimation;
}

- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
    [self setBackgroundColor:[UIColor clearColor]]; //makes this view transparent other than what is drawn.

    [self initChar];
}

return self;
}

static CATransform3D CATransform3DMakePerspective(CGFloat z)
{
CATransform3D t = CATransform3DIdentity;
t.m34 = - 1. / z;
return t;
}



-(void) initChar 
{
UIFont *theFont = [UIFont fontWithName:@"AmericanTypewriter" size:FONT_SIZE];

self.layer.sublayerTransform = CATransform3DMakePerspective(-1000.0f);

topHalfCharLayer2 = [CATextLayer layer];

topHalfCharLayer2.bounds = CGRectMake(0.0f, 0.0f, CHARACTERS_WIDTH, 100.0f);
topHalfCharLayer2.string = @"R";    
topHalfCharLayer2.font = theFont.fontName;
topHalfCharLayer2.fontSize = FONT_SIZE;
topHalfCharLayer2.backgroundColor = [UIColor blackColor].CGColor;
topHalfCharLayer2.position = CGPointMake(CGRectGetMidX(self.bounds),CGRectGetMidY(self.bounds));

topHalfCharLayer2.wrapped = NO;


topHalfCharLayer1 = [CATextLayer layer];


topHalfCharLayer1.bounds = CGRectMake(0.0f, 0.0f, CHARACTERS_WIDTH, 100.0f);
topHalfCharLayer1.string = @"T";


topHalfCharLayer1.font = theFont.fontName;
topHalfCharLayer1.fontSize = FONT_SIZE;

topHalfCharLayer1.backgroundColor = [UIColor redColor].CGColor;
topHalfCharLayer1.position = CGPointMake(CGRectGetMidX(self.bounds),CGRectGetMidY(self.bounds));
topHalfCharLayer1.wrapped = NO;
//topHalfCharLayer1.zPosition = 100;

[topHalfCharLayer1 setAnchorPoint:CGPointMake(0.5f,1.0f)];

[[self layer] addSublayer:topHalfCharLayer1 ];
[[self layer] insertSublayer:topHalfCharLayer2 atIndex:0];

[topHalfCharLayer1 addAnimation:[self topCharFlap] forKey:@"anythingILikeApparently"];

}

包含此代码的视图由loadView中的视图控制器加载。在视图的initWithFrame方法中调用initChar方法。目标是iOS4。我没有使用setWantsLayer,因为我读过iOS中的UIView是自动进行图层备份的,不需要这个。

3 个答案:

答案 0 :(得分:1)

想到几个想法:

  • 尝试在开始动画之前将“R”图层添加到图层层次结构

  • 不是在索引1处插入“T”图层,而是使用[[self layer] addSublayer: topHalfCharLayer1];添加,然后对“R”执行插入操作'with [[self layer] insertSublayer:topHalfCharLayer2 atIndex:0];

  • 的图层
  • 您是否尝试使用图层 zPosition ?这决定了图层的视觉外观。它实际上不会改变图层顺序,但会改变它们显示的方式 - 例如。哪些层位于/后面。

  • 我还建议您删除动画代码,直到您对图层视图顺序进行排序。完成后,动画应该可以正常工作。

如果您还有其他问题,请在评论中告诉我。

最好的问候。

答案 1 :(得分:1)

来自quartz-dev apple邮件列表:

通常在2D情况下,addSublayer会在上面绘制新图层 以前。但是,我相信这种实施机制是 独立于zPosition,可能只是使用类似的东西 画家的算法。但是当你添加zPositions和3D时,我没有 认为你可以完全依赖层排序。但我其实不清楚 如果Apple在您未设置的情况下保证任何内容 zPositions在你的图层上,但有一个3D变换矩阵集。

因此,在将3D变换应用于图层时,似乎必须明确设置zPosition。

答案 2 :(得分:0)

/* Insert 'layer' at position 'idx' in the receiver's sublayers array.
 * If 'layer' already has a superlayer, it will be removed before being
 * inserted. */

open func insertSublayer(_ layer: CALayer, at idx: UInt32)