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问题:在开始时显示结束图像的主要内容,如果未能解决你的问题,请参考以下文章