2010-06-16 2 views
10

В IB я могу установить идентификатор UIBarButtonItem для воспроизведения, который добавляет изображение кнопки воспроизведения (правый треугольник).Измените (не init) идентификатор UIBarButtonItem программно?

Есть способ изменить это изображение программным путем? Я хочу изменить его на «пауза» при нажатии кнопки воспроизведения.

Я знаю, что вы можете инициализировать UIBarButtonItem с идентификатором, но мне еще предстоит найти способ изменить его после его инициализации. Возможно ли это?

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

Любые мысли?

ответ

14

Хорошо, я догадался об этом вопросе до смерти и столкнулся с sample code from Apple, где они делают то же самое (переключение кнопки воспроизведения/паузы на кнопке на панели инструментов). Но вместо использования встроенных идентификаторов воспроизведения и паузы UIBarButtonItem они используют пользовательский UIButton и переключают пользовательские изображения.

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

Это то, что они (Apple) делать для переключения изображения при нажатии кнопки:

// Call this when the button you want to toggle is pressed: 
[playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal]; 

Заменить p.playing с любым BOOL вы хотите, чтобы держать состояние вашей кнопки. playButton - это обычай UIButton на панели инструментов. pauseBtnBG и playBtnBG - изображения для переключения.

13

Это, кажется, работает довольно хорошо:

UIBarButtonItem *oldButton = [myToolBar.items objectAtIndex:1]; 
[myToolBar setItems:[NSArray arrayWithObjects:[myToolBar objectAtIndex:0], [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop target:self action:@selector(tapStopRefreshButton:)],nil] animated:NO]; 
[oldButton release]; 

В этом примере я имел панель инструментов для UIWebView и когда кто-то нажал Reload Я хотел, чтобы это изменить, чтобы остановить. На панели инструментов было только гибкое пространство и одна кнопка на нем - чтобы выровнять по правому краю кнопку - поэтому я взял ссылку на старую кнопку, сделал новую с тем же селектором, что и старый, сбросил кнопки на панели вкладок , а затем отпустили исходную кнопку.

Не самый красивый, но вы можете использовать все стандартные кнопки без необходимости переопределять класс (ы) кнопки.

+0

Apple, делает это на примере StitchedStreamPlayer: http://developer.apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010092 – pablasso

+0

Хотя технически не " меняя 'UIBarButtonSystemItem', как это происходит после OP, этот ответ позволяет * замене * одного элемента системы другим. – 2012-04-30 16:11:23

+0

Хотя в этом примере новый 'UIBarButtonItem' должен быть инициализирован перед помещением в массив, поэтому он может быть правильно выпущен. – 2012-05-01 08:28:32

0

Как насчет двух сложенных панелей инструментов? Тогда вы можете иметь некоторые системные кнопки в верхней, а другие - в нижней. Если нажата кнопка воспроизведения, просто скройте верхнюю панель инструментов.

+0

Он ищет, чтобы изменить изображение или поменять кнопку, а не панель инструментов исчезнет. – JoshDM

+0

@JoshDM Однако, если панель инструментов исчезнет, ​​кнопка, отображаемая пользователю, изменится. Кроме того, в этих случаях, как правило, у вас нет ни одного, а набора кнопок, которые вы должны изменить, поэтому мне легче создавать две разные панели инструментов со стандартным UIBarButtonItem вместо создания и переключения пользовательских UIButtons. Также проще «скрыть» представление. Но вы правы, это не ответ на вопрос, это ответ на проблему с аськой. – FranMowinckel