CABasicAnimation CALayer转换的可见性(重叠)问题

时间:2010-02-25 21:04:19

标签: objective-c uiview calayer transformation cabasicanimation

我的对象上有两个UIImageViews,我正试图将它们设置为像书本一样的页面。我暂时使用了一些内置动画(UIViewAnimationTransitionFlipFromLeft/Right),并决定我可以做得更好。我找到了一个很好的例子,我想要的动画有一半:http://fiftysixtysoftware.com/blog/2009/uiview-pageopen-sample-project/

我能够从那里进行推断以使我的动画工作......但我遇到的问题是我的动画图像(右图)总是在左侧图像下方显示

这是init中的代码:

// set up some rects for use later
landscapeLeftRect = CGRectMake(0, 12, 512, 725);
landscapeRightRect = CGRectMake(512, 12, 512, 725);

// all our images
imageLeft = [[UIImageView alloc] initWithFrame:portraitRect];
imageRight = [[UIImageView alloc] initWithFrame:landscapeRightRect];

...并执行实际动画(请注意,这是动画的后半部分,与imageLeft视图“重叠”的一半):

// set the image to be nextLeft
//[imageRight setImage:image.nextLeft];
[self.view sendSubviewToBack:imageLeft];
[self.view bringSubviewToFront:imageRight];
//[imageRight.layer setZPosition:1.0f];
[imageRight setFrame:landscapeLeftRect];

// remove any previous animations
[imageRight.layer removeAllAnimations];

// set up the anchorPoint and center
if (imageRight.layer.anchorPoint.x != 1.0f) {
    imageRight.layer.anchorPoint = CGPointMake(1.0f, 0.5f);
    imageRight.center = CGPointMake(imageRight.center.x + imageRight.bounds.size.width/2.0f, imageRight.center.y);
}

// create an animation to hold the first half of the page turning forward
CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
transformAnimation.removedOnCompletion = YES;
transformAnimation.duration = 0.40f;
transformAnimation.delegate = self;
transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// start the animation from the current state
CATransform3D endTransform = CATransform3DMakeRotation(3.141f/2.0f,
                                                       0.0f,
                                                       -1.0f,
                                                       0.0f);
// these values control the 3D projection outlook
endTransform.m34 = -0.001f;
endTransform.m14 = 0.0015f;
transformAnimation.fromValue = [NSValue valueWithCATransform3D:endTransform];
// we should end up at the beginning...
transformAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];

[imageRight.layer addAnimation:transformAnimation forKey:nil];

我尝试过的事情:(你可以在上面的代码中看到)

  • bringSubviewToFront / sendSubviewToBack
  • 在图层上设置Z索引

提前感谢任何建议或智慧。同样,问题在于我的imageLeft始终显示在动画之上。

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,发现你可以通过设置视图的zPosition来修复它。 我使用过这样的东西:

  

viewThatShouldBeSentToTheBack.layer.zPosition = -10000;

答案 1 :(得分:0)

我发现,一旦我将动画视图放到前面,一切都有效。我正在处理翻页动画,当向后翻页以逆时针方式显示页面叠加时遇到了麻烦。我的麻烦在于我无法看到动画,因为它位于应该叠加的页面后面。

答案 2 :(得分:0)

在将页面视图添加到superview时,您确定正在迭代数组吗?当然,你会想要把最后一页放在首位,这样你的第一页就在最顶层......我不是在侮辱你的智慧 - 层次可能很棘手。

答案 3 :(得分:0)

我遇到了这个精确的问题,我发现避免它的唯一方法是将tyhe背景的zPosition设置为一个大的负数。很高兴知道为什么......