2010-08-17 3 views
1

Хорошо, у меня есть следующая очень простая анимация, состоящая из 25 кадров в формате PNG. Каждый кадр имеет размер 320 × 360 и около 170 КБ. Вот код, я используюАнимация UIImageView начинается через несколько секунд после запуска. Выводится уведомление.

.h:

IBOutlet UIImageView *Animation_Normal_View; 

В Interface Builder У меня есть UIImageView с выпускным отверстием реферирование, указывая на это. Все мои изображения названы normal_000_crop.png, normal_001_crop.png, normal_002_crop.png ...

.m:

Animation_Normal = [[NSMutableArray alloc] initWithCapacity:25]; 
for (int i = 0; i < 25; i++) 
{ 
    [Animation_Normal addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"normal_%03d_crop.png", i] ofType:nil]]]; 
} 

Animation_Normal_View.animationImages = Animation_Normal; 
Animation_Normal_View.animationDuration = 1; // seconds 
Animation_Normal_View.animationRepeatCount = 0; // 0 = loops forever 
[Animation_Normal release]; 


[self.view addSubview:Animation_Normal_View]; 
[Animation_Normal_View startAnimating]; 

На тренажере всех loogs хорошей визуальную анимации начать как SOOS, как выдаются startAnimating ,

Но на iPhone 3G, работающем под управлением iOS 4.0.2, визуальная анимация начинается через 2 - 3 секунды после выпуска startAnimating.

Я пробовал каждую технику, которую я мог найти в блогах или на форуме, которые должны решить это безрезультатно.

Любые подсказки оценены, даже если это совершенно отличный способ для анимации, основанной на PNG.

Спасибо.

ответ

2

imageWithContentsOfFile: имеет тенденцию занимать много времени, особенно если есть много файлов (25 - это много) и/или они большие.

Одна вещь, вы можете попробовать это, чтобы переключить его на imageNamed :, то есть

[UIImage imageNamed:[NSString stringWithFormat:@"normal_%03d_crop.png", i]] 

imageNamed: как правило, гораздо быстрее, но, как правило кэшировать изображения более или менее неопределенно.

Если загрузка изображений в память и их хранение по всему приложению неприемлема, вам может потребоваться сделать некоторые трюки, чтобы загрузить их в соответствующее время и выгрузить их после их использования. Этот материал всегда сложный и требует многопоточности, чтобы не блокировать основной пользовательский интерфейс при загрузке. Но выполнимо. И есть примеры.

5

Это хороший вопрос, и я рассмотрю его здесь с несколькими мыслями.

Во-первых, вы загружаете серию графических изображений, размер которых составляет около 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

+0

Wow Kevin! Спасибо, что нашли время написать все это. Я еще не переварил все это, но прочитаю его очень внимательно. Снова спасибо. Это сообщество разработчиков программного обеспечения! – user422808

0

Загрузите эти изображения перед использованием метода запуска оживляющий. Я советю более простой способ «Просто запустите метод анимации начала вызова в applicationDidEnterForeground. Когда вы вызываете это, не забывайте об альфа-свойстве UIImageView. Если вы установите uiimageiew.alpha = 0.01, как это, будет вызван ваш метод анимации начала и пользователь не может видеть эту анимацию ", так что больше не будет отставания.

Смежные вопросы