Я использую анимацию ключевых кадров для анимации последовательности изображений. Но когда я запускаю его в первый раз, перед началом анимации возникает задержка. После этого работает ровно. Я попытался принудительно загрузить все изображения. Это уменьшило задержку, но она все еще видна. Как еще уменьшить задержку.
Задержка анимации ключевого кадра при первом запуске
Ответы (4)
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();
Теперь у вас есть не только ссылка на изображения, но они были принудительно отрисованы, и, надеюсь, система сохранит это внутреннее растровое изображение. Это должно быть легким испытанием для вас.
Этот код предназначен для быстрой версии 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")
}
Ну, это работает для меня.
Недавно у меня была эта проблема, и я решил ее, «предварительно запустив» анимацию как можно раньше с продолжительностью 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
предотвратила это.
Рассмотрите возможность предварительной загрузки изображений в файл 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
Надеюсь это поможет. Ваше здоровье!