我将两个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是自动进行图层备份的,不需要这个。
答案 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)