2

我正在使用关键帧动画来为一系列图像设置动画。但是当我第一次运行它时,动画开始之前会有延迟。之后,它运行顺利。我尝试强制加载所有图像。它减少了延迟,但它仍然可见。我怎样才能进一步减少延迟。

4

4 回答 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 回答