我正在使用关键帧动画来为一系列图像设置动画。但是当我第一次运行它时,动画开始之前会有延迟。之后,它运行顺利。我尝试强制加载所有图像。它减少了延迟,但它仍然可见。我怎样才能进一步减少延迟。
问问题
657 次
4 回答
2
Apple 因使用“延迟”加载技术而臭名昭著,很可能放置从“[UIImage imageNamed:]”检索到的图像实际上并没有创建缓存位图,只是创建它的收据。
如果所有其他方法都失败了,请尝试蛮力方法:强制系统通过在上下文中渲染图像来渲染它,然后你就扔掉了。
CGSize bigSize; // MAX width and height of your images
UIGraphicsBeginImageContextWithOptions(bigSize, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
for(UIImage *image in arrayOfImages) {
CGContextDrawImage(context, (CGRect){ {0,0}, image.size }, [image CGImage]);
}
UIGraphicsEndImageContext();
现在您不仅可以参考图像,而且还被迫渲染它们,因此希望系统保留该内部位图。对你来说应该是一个简单的测试。
于 2012-08-07T11:30:43.917 回答
1
此代码适用于 swift 2.2!
尝试在动画结束之前放置您想要的最终图像。
它更像是:
// the animation key is for retrive the informations about the array images
func animation(cicleTime:Int, withDuration: Double, animationKey:String){
var images = [UIImage]()
// get all images for animation
for i in 0...cicleTime {
let fileName = String(format: "image%d",i)
let image = UIImage(named: fileName)
images.append(image!)
}
let animation = CAKeyframeAnimation(keyPath: "contents")
animation.setValue(animationKey, forKey: "animationName")
animation.duration = withDuration
animation.repeatCount = 1 // times you want to repeat the animation
animation.values = images.map{$0.CGImage as! AnyObject}
animation.delegate = self
images.removeAll(keepCapacity: false)
YourViewHere.layer.addAnimation(animation, forKey: "contents")
YourViewHere.image = UIImage(named: "nameOfYourLastImageOfAnimation")
}
好吧,这对我有用。
于 2016-04-03T23:24:33.497 回答
0
我最近遇到了这个问题,并通过尽早“预运行”动画来解决它,持续时间为 ,0
并且在完成时不删除它。当我真正想运行它时,整个序列已加载且流畅
let animation: CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "contents")
animation.calculationMode = kCAAnimationDiscrete
animation.duration = 0
animation.values = spritesArray
animation.repeatCount = 1
animation.removedOnCompletion = false
animation.fillMode = kCAFillModeForwards
layer.addAnimation(animation, forKey: "animateIn")
在我的情况下,我实际上已经将序列拆分为 2 个单独的关键帧动画用于介绍/结尾,并且结尾总是在开始之前停止。在持续时间关键帧动画中首先预加载整个事物可以0
防止这种情况发生。
于 2016-08-04T14:53:23.347 回答
-1
考虑将图像预加载到NSArray
. 您的延迟很可能是由于它首先必须加载图像。
所以,基本上,假设你有img1.png
,img2.png
等最多img10.png
:
//do this before your keyframe animation.
NSMutableArray *frames = [NSMutableArray array];
for(int i = 1 ; i <= 10 ; i++)
[frames addObject:[UIImage imageNamed:[NSString stringWithFormat:@"img%d.png" , i]]];
//now use this array for the animation
希望这可以帮助。干杯!
于 2012-08-07T11:06:25.847 回答