Это хороший вопрос, и я рассмотрю его здесь с несколькими мыслями.
Во-первых, вы загружаете серию графики общим объемом около 4 МБ. Это может занять некоторое время, особенно на более медленных (старых) устройствах.
В блоке @ interface вашего .h файла вы можете объявить два свойства, таких как:
IBOutlet UIImageView *animationViewNormal;
NSMutableArray *animationViewNormalImages;
Первый - это UIImageView, который у вас уже есть (просто переименован для лучших практик), а второй - изменяемый массив, содержащий стек изображений для просмотра изображений. Позвольте мне заявить, что если «нормальный» подразумевает состояние. Для уточнения загружаете ли вы дополнительные наборы изображений для разных состояний?
В вашем файле .m в интерфейсе @ создайте следующий метод:
- (void)loadAnimationImages;
Это предоставит функцию для вывода стека изображений в изменяемый массив, определенный в заголовке.
В том же файле .m в реализации @ вам понадобится следующее:
- (void)loadAnimationImages {
for (NSUInteger i = 0; i < 23; i++) {
NSString *imageName = [NSString stringWithFormat:@"normalCrop%03u", i];
UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]];
if (image) {
[animationViewNormalImages addObject:image];
}
}
}
Как вы можете видеть, я переименовал PNG-файлы из normal_% 03u_crop в normalCrop% 03u, так как лучше всего ставить метку индекса в конце имени файла (также большинство приложений выводят контент таким образом). Цикл загружает изображение, проверяет, является ли оно изображением, а затем добавляет изображение в «стек изображений» в изменяемом массиве.
В init () вам понадобится следующее:
- (id)init {
...
animationViewNormalImages = [[NSMutableArray alloc] init];
...
}
Это выделяет изменяемый массив ( animationViewNormalImages ) для хранения вашей стопки изображений для просмотра изображений.
Теперь перейдем к коду для viewDidLoad () :
- (void)viewDidLoad {
[super viewDidLoad];
...
[self loadAnimationImages];
[animationViewNormal setAnimationImages:animationViewNormalImages];
[animationViewNormal setAnimationDuration:1.1f];
[animationViewNormal setAnimationRepeatCount:0]; // 0=infinite loop
...
}
Мы загружаем стопку изображений в изменяемый массив, затем устанавливаем свойства нашего imageView с помощью стека изображений, длительности и количества повторений.
Далее в viewDidAppear () мы запускаем анимацию просмотра изображения:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
...
[animationViewNormal startAnimating];
...
}
После того, как imageView анимируется как бесконечный цикл, мы должны обрабатывать его при выходе из вида в viewWillDisappear () :
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
...
[animationViewNormal stopAnimating];
...
}
Последнее (что должно быть вторым, что мы добавляем в файл .m ), которое мы очищаем в изменяемом массиве в dealloc () :
- (void)dealloc {
...
[animationViewNormalImages release];
[super dealloc];
}
Вот как мы с этим справляемся и работаем для нас, но опять же, мы обычно не загружаем 4 МБ изображений в память для анимации.
.PNG-файлы сжимаются при сборке приложения, и я не уверен, распаковываются ли они на лету при загрузке изображений нашего пакета ресурсов. Это логическое значение в настройках сборки свойств сборки (COMPRESS_PNG_FILES).
Для производительности вы можете рассмотреть следующее:
- Пометить непрозрачные виды как таковые:
Составление представления, содержимое которого
непрозрачный требует гораздо меньше усилий, чем
сочинять тот, который частично
прозрачный. Чтобы сделать вид непрозрачным,
содержание представления не должно
содержать любую прозрачность и
непрозрачное свойство вида должно быть
установить на ДА.
- Удалить альфа-каналы из непрозрачного PNG
файлы: если каждый пиксель изображения PNG
непрозрачен, удаляя альфа
канал избегает необходимости смешивать
слои, содержащие это изображение. это
упрощает компоновку изображения
значительно и улучшает рисунок
производительность.
Кроме того, вы можете обнаружить, что лучше создать одно большое изображение со всеми 24 кадрами (смещение по ширине отдельного кадра), а затем загрузить его один раз. Затем, используя Core Graphics с CGContextClipToRect , просто сместите контекст изображения. Это означает больше кода, но может быть быстрее, чем при использовании стандартного метода стека.
Наконец, вы можете рассмотреть вопрос о преобразовании файлов .PNG в файлы .PVR (PVRTC). Дополнительную информацию можно найти здесь: Apple Tech QA , Apple Docs и Пример кода .
Я надеюсь, что это поможет, и, пожалуйста, проголосуйте, если это так.
Лучший,
Kevin
Able Pear Software