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

问题描述 投票:3回答:3

在我 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];

再次感谢各位!

ios core-animation catransition
3个回答
3
投票

删除下面一行。

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];

1
投票

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


0
投票

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

transition.fillMode = .backwards

来自 文件

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.