#iphone #uiimageview
#iPhone #uiimageview
Вопрос:
Я провожу некоторое тестирование, чтобы попытаться придумать наилучший способ добавления небольших анимаций в UIImageView.
Следующий код работает, однако при первом вызове возникает задержка, когда я предполагаю, что анимация загружается. Как я должен загрузить анимацию, чтобы избежать этой задержки? При повторном вызове он запускается мгновенно. Этот код находится в методе loadView -(void) и [animation startAnimating]; вызывается из пользовательского метода. Примечание: UIImageView * animation на самом деле является экземпляром var.
NSString *imageName;
NSMutableArray *animImages = [[NSMutableArray alloc]init];
for(int i = 0; i <= 40; i ) {
imageName = [NSString stringWithFormat:@"frame_%d.png", i];
[animImages addObject:[UIImage imageNamed:imageName]];
}
UIImageView *animation; // is actually an instant var declared in header.
animation = [[UIImageView alloc]initWithFrame:CGRectMake(50, 0, 600, 300)];
animation.animationImages = animImages;
animation.animationDuration = 2;
animation.animationRepeatCount = 1;
Мне нужно иметь несколько анимаций в одном UIView, поэтому я также хотел бы знать, является ли это лучшим способом добавления нескольких анимаций в представление и правильным способом управления памятью в этом методе.
Большое спасибо
Ответ №1:
Предпочитаю загружать ресурсы в viewDidLoad, а не loadView. Вы должны удалить их в viewDidUnload, загрузка в viewDidLoad вернет их обратно, если ваш просмотр загрузится снова.
Можно утверждать, что вы также могли бы удалить их в didReceiveMemoryWarning, но AFAIK viewDidUnload следует использовать для освобождения элементов пользовательского интерфейса. Если вы используете didReceiveMemoryWarning, вы можете проверить, будет ли viewDidLoad вызван снова, отпуская только в том случае, если был вызван viewDidUnload:
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
if (![self isViewLoaded]) {
// release resources
}
}
Но если анимация — это экземпляр var, и вы действительно это делаете
UIImageView *animation = [[UIImageView alloc]initWithFrame:CGRectMake(50, 0, 600, 300)];
вы устанавливаете не переменную intance, а локальную.
Позже
Что касается задержки: для загрузки 40 изображений требуется время, независимо от того, что вы делаете. Если вы не хотите задержки в пользовательском интерфейсе, загрузите их в фоновом режиме и уведомите пользовательский интерфейс, когда это будет сделано. За это время вы можете показать что-то, что отвлекает внимание от задержки.
Комментарии:
1. Спасибо за информацию о памяти. Я подумал, что, поскольку я не использовал Nib, это лучшее место для размещения кода пользовательского интерфейса? Придется изучить это. Анимация UIImageView * — это правильный экземпляр var в моем реальном коде, однако я не синтезирую его, не так ли?, Я просто поместил это в предыдущий код в качестве примера, как указано в примечании. Мне действительно следовало написать это в примере кода. Виноват.
2. Вам не нужно синтезировать, вы не собираетесь получать к нему доступ извне. Для самого класса достаточно переменной экземпляра. Правила относительно того, когда загружать, являются всего лишь условностями, нарушайте их, если вам это нужно, и знайте, что вы делаете. Например, если вам не нужно удалять анимации при предупреждении о памяти, потому что ваше приложение не работает без них, тогда нет необходимости думать о том, куда его загружать и куда выгружать — они просто есть все время. Что касается задержки, смотрите комментарий в вопросе.