如何在一个特定的索引添加动画层(How to add an animated layer at a

2019-10-30 03:32发布

我把两个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视图控制器加载。 该initChar方法被称为视图的initWithFrame方法。 我们的目标是iOS4的。 我没有使用setWantsLayer因为我读过的UIView在iOS的自动备份层,也不需要这个。

Answer 1:

一对夫妇的想法浮现在脑海中:

  • 尝试添加“R”层的层分层启动动画之前

  • 代替索引1处插入 'T'层,使用[[self layer] addSublayer: topHalfCharLayer1]; 添加它,然后执行用于与“R”层插入[[self layer] insertSublayer:topHalfCharLayer2 atIndex:0];

  • 您是否尝试过与该层z位置玩? 这决定了层的视觉外观。 它实际上并不转移层的顺序,但会改变它们显示的方式 - 这些层是在/它的后面的前面例如。

  • 我想,直到你得到排序层视图命令也建议你删除动画代码。 一旦你这样做,动画应该只是工作。

如果您还有其他问题,让我知道了意见。

最好的祝福。



Answer 2:

从石英-dev的苹果邮件列表:

通常在2D情况下,addSublayer将绘制上述先前的新层。 不过,我相信这实现机制是独立的z向位置,可能只是使用类似于画家算法。 但是此刻你添加zPositions和3D,我不认为你可以仅仅依靠层序。 但我如果苹果可以保证在你没有设置你的图层zPositions,但有一个3D变换矩阵集的情况下任何实际不清楚。

所以,看来我要明确设置z位置时,应用3D变换到图层。



Answer 3:

/* 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)


文章来源: How to add an animated layer at a specific index