iPhone SDK: установите анимированное загрузочное изображение (снаряжение) в UIBarButtonItem - PullRequest
0 голосов
/ 19 января 2010

Есть ли способ установить анимированное изображение, например, спиннинг Apple, в UIBarButtonItem?

Я пробовал эту строку кода, но анимированное GIF-изображение не воспроизводится:

myButton.image = [UIImage imageNamed:@"spinningGear.gif"];

Ответы [ 4 ]

2 голосов
/ 19 января 2010

Попробуйте создать UIActivityIndicatorView и назначить его кнопке с помощью -[UIBarButtonItem initWithCustomView:].

0 голосов
/ 25 февраля 2013

Я сделал это, установив customView UIBarButtonItem на UIButton с изображением значка, затем добавив UIActivityIndicator в качестве подпредставления UIButton.

Чтобы настроить его, я просто перетащил UIButton на UIBarButtonItem в Интерфейсном Разработчике (вы также можете сделать это в своем коде). Затем для отображения индикатора активности:

UIButton *customButton = (UIButton *)self.refreshButton.customView;
[customButton setImage:nil forState:UIControlStateNormal];
[customButton removeTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[customButton addTarget:self action:@selector(altButtonAction) forControlEvents:UIControlEventTouchUpInside];
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
self.activityIndicator.frame = CGRectMake(round((customButton.frame.size.width - 25) / 2), round((customButton.frame.size.height - 25) / 2), 25, 25);
self.activityIndicator.userInteractionEnabled = FALSE; // this allows the button to remain tappable
[customButton addSubview:self.activityIndicator];
[self.activityIndicator startAnimating];

И чтобы вернуться к состоянию кнопки по умолчанию:

UIButton *customButton = (UIButton *)self.refreshButton.customView;
[customButton setImage:[UIImage imageNamed:@"IconRefresh"] forState:UIControlStateNormal];
[customButton removeTarget:self action:@selector(altButtonAction) forControlEvents:UIControlEventTouchUpInside];
[customButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.activityIndicator removeFromSuperview];
[self.activityIndicator release];

Несколько заметок:

  1. Если вы не хотите изменять действие кнопки, когда она находится в «активном» состоянии, вы можете удалить строки addTarget и removeTarget.
  2. Если вы не хотите, чтобы кнопка была нажатой, когда она находится в «активном» состоянии, вы можете пропустить строку userInteractionEnabled для индикатора активности (или удалить цель и повторно добавить ее).
  3. Элемент UIBarButtonItem с настраиваемым видом не будет отображать границу кнопки. Если вы хотите эту границу, вам придется создать собственное изображение и добавить его в качестве фонового изображения кнопки UIB.
0 голосов
/ 29 июля 2010

Я обнаружил, что эта строка неверна:

[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];

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

К сожалению, Apple не предоставляет API для определения размера. Методом проб и ошибок кажется, что это правильно:

[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 28, 28)];
0 голосов
/ 19 января 2010

Я не думаю, что это возможно с UIBarButtonItem.

Вы можете использовать customView для этого (свойство или initWithCustomView) и использовать UIImageView в качестве этого представления. Это по-прежнему не будет оживлять GIF "из коробки" (только что проверил).

Если вы сделаете это, у вас есть два варианта:

  • используйте animatedImages из класса UIImageView и используйте отдельные изображения для каждого кадра (при записи из заголовка может быть несколько ошибок):

NSMutableArray * imgs = [NSMutableArray array]; for(int i = 0; i < NUMBER_OF_FRAMES; i++) { [imgs addObject: [UIImage imageNamed: [NSString stingWithFormat: @"anim%d.png", i]]]; } UIImageView * imgview = [[UIImageView alloc] init]; imgview.animatedImages = imgs; [imgview startAnimating];

...