iOS - CATransition问题:在开始时显示结束图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS - CATransition问题:在开始时显示结束图像相关的知识,希望对你有一定的参考价值。

在我 UIViewController 我创造 CALayer 与图像1。

CALayer *imageLayer = [CALayer layer];
[imageLayer setBounds:CGRectMake(0.0, 0.0, 241.0, 430.0)];
[imageLayer setPosition:CGPointMake(160.0, 60.0)];
[imageLayer setAnchorPoint:CGPointMake(0.5, 0.0)];
[imageLayer setContents:(id)[UIImage imageNamed:@"image1.png".CGImage];
[imageLayer setContentsGravity:kCAGravityResizeAspect];
[self.view.layer addSublayer:imageLayer];

后来在 UIViewController 我想通过推送来改变图像,使用的是 CATransition.

CATransition *t = [CATransition animation];
t.beginTime = [self.view.layer convertTime:CACurrentMediaTime() + 6.5 fromLayer:nil];
t.type = kCATransitionPush;
t.subtype = kCATransitionFromRight;
[imageLayer setContents:(id)[UIImage imageNamed:@"image2.png"].CGImage];    
[imageLayer addAnimation:t forKey:nil];

当运行代码时,我从一开始就得到image2,过渡工作,虽然6.5秒后推自己。image1在哪里?出了什么问题?

正确答案。谢谢Jacky Boy和Tiago Almeida. 我改正了代码,删除了那行字。

t.beginTime = [self.view.layer convertTime:CACurrentMediaTime() + 6.5 fromLayer:nil];

并添加'dispatch_after'。

现在可以用了。

CATransition *t = [CATransition animation];
t.type = kCATransitionPush;
t.subtype = kCATransitionFromRight;
[imageLayer setContents:(id)[UIImage imageNamed:@"image2.png"].CGImage];    
[imageLayer addAnimation:t forKey:nil];
[CATransaction begin];
NSTimeInterval delayInSeconds = 6.5;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
    [imageLayer setContents:(id)[UIImage imageNamed:@"image2.png"].CGImage];
    [imageLayer addAnimation:t forKey:nil];
);
[CATransaction commit];

再次感谢各位!

答案

删除下面一行。

t.beginTime = [self.view.layer convertTime:CACurrentMediaTime() + 1.5 fromLayer:nil];

这是什么延迟动画,所以图层是设置新的内容,而且是在图层动画化之后才设置的。如果你想指定动画的持续时间。

[CATransaction begin];
[CATransaction setAnimationDuration:1.0];

CATransition *t = [CATransition animation];
t.type = kCATransitionPush;
t.subtype = kCATransitionFromRight;
[_layer setContents:(id)[UIImage imageNamed:@"image2.jpg"].CGImage];
[_layer addAnimation:t forKey:nil];


[CATransaction commit];

或一个较小的版本。

CATransition *t = [CATransition animation];
t.type = kCATransitionPush;
[t setDuration:2.5];
t.subtype = kCATransitionFromRight;
[_layer setContents:(id)[UIImage imageNamed:@"image2.jpg"].CGImage];
[_layer addAnimation:t forKey:nil];

我更喜欢这样。

CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.duration = .25f;
transition.subtype = kCATransitionFromRight;

_layer.actions = @@"contents": transition;

而当你想改变内容的时候

[_layer setContents:(id)[UIImage imageNamed:@"image2.jpg"].CGImage];
另一答案

你要创建的是 imageLayer 但配置 currentCharacterImageLayer.

另一答案

这里正确的解决方案实际上是使用 fillMode 属性上的过渡。即(在Swift中,对不起)

transition.fillMode = .backwards

来自 文件

如果你延迟了动画的开始,你可能还想设置了 fillMode 属性为 kCAFillModeBackwards. 这种填充模式会使图层显示动画的起始值,即使图层树中的图层对象包含不同的值。如果没有这个填充模式,你会在动画开始执行之前看到跳转到最终值。其他填充模式也是可用的。

dispatch_after 将适用于某些情况,但如果你需要合成动画,例如使用 CATransaction

谢谢你把这个问题贴出来,让我找到了正确的答案。

以上是关于iOS - CATransition问题:在开始时显示结束图像的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中使用过滤器的 CATransition

如何在 CATransition 中指定开始和结束位置?

使用 CATransition 重新创建 iOS 应用打开过渡

CATransition 动画在 iOS 中需要很长时间

iOS核心笔记——核心动画-CATransition

CATransition