Это хороший вопрос, и я рассмотрю его здесь с несколькими мыслями.
Во-первых, вы загружаете серию графических изображений, размер которых составляет около 4 МБ. Это может занять некоторое время, особенно на более медленных (более старых) устройствах.
В @interface блока файл .h вы можете объявить два свойства, такие как:
IBOutlet UIImageView *animationViewNormal;
NSMutableArray *animationViewNormalImages;
Первым является UIImageView, что у вас уже есть (только переименован лучшие практики), а второй - измененный массив для хранения стопки изображений для изображения. Позвольте мне сказать, что если «нормальное» подразумевает состояние. Для выяснения, загружаете ли вы дополнительные наборы изображений для разных состояний?
В вашем .м файл в @interface создать следующий метод:
- (void)loadAnimationImages;
Это обеспечит функцию, чтобы привести стек изображения в изменяемом массиве, указанном в заголовке.
В том же .m файл в @implementation вы хотите следующее:
- (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 файла) мы в очистке изменяемого ARRA у в dealloc():
- (void)dealloc {
...
[animationViewNormalImages release];
[super dealloc];
}
Это, как мы обрабатываем его и работает для нас, но опять же, мы обычно не загружаются 4MB изображений в памяти для анимации.
Файлы .PNG сжимаются при создании приложения, и я не уверен, что они распаковываются «на лету» при загрузке изображений из нашего ресурсного пакета. Это логическое значение в настройках сборки свойств сборки (COMPRESS_PNG_FILES).
Для выполнения вы можете рассмотреть следующие вопросы:
- Все непрозрачные виды, как, например: композитинга вид, содержимое которого непрозрачный требует гораздо меньше усилий, чем композитинга тот, который частично прозрачным.Чтобы сделать вид непрозрачным, , содержимое представления не должно содержать любую прозрачность, а непрозрачное свойство вида должно быть
установлено в YES.
- Удалить альфа-каналы из непрозрачных PNG файлов: Если каждый пиксель изображения PNG непрозрачен, удаление альфа-канала позволяет избежать необходимости смешивать слоев, содержащих этот образ. Это значительно упрощает компоновку изображения и улучшает рисунок производительность.
Кроме того, вы можете обнаружить, что лучше сделать одно большое изображение со всеми 24 кадрами (смещение по ширине отдельной рамки), а затем загрузить его один раз. Затем, используя Core Graphics с CGContextClipToRect, просто смещайте контекст изображения. Это означает больше кода, но может быть быстрее, чем использование стандартного метода стека.
Наконец, вы можете рассмотреть возможность преобразования файлов .PNG в файлы .PVR (PVRTC). Более подробную информацию можно найти здесь: Apple Tech QA, Apple Docs и Sample Code.
Я надеюсь, что это поможет и, пожалуйста, проголосуйте, если это произойдет.
Best, Кевин Способный Груша Software
Wow Kevin! Спасибо, что нашли время написать все это. Я еще не переварил все это, но прочитаю его очень внимательно. Снова спасибо. Это сообщество разработчиков программного обеспечения! – user422808