2010-06-16 72 views
10

在IB中,我可以將UIBarButtonItem的標識符設置爲'play',其中添加了播放按鈕(右指向三角形)的圖像。以編程方式更改(不初始化)UIBarButtonItem標識符?

有沒有辦法以編程方式更改此圖像?我想在按下播放按鈕時將其更改爲「暫停」。

我知道你可以使用一個標識符來初始化一個UIBarButtonItem,但我還沒有找到一種方法來改變它初始化後。這甚至有可能嗎?

我能想到的唯一的事情就是刪除舊按鈕並在其位置初始化一個新按鈕,但這看起來效率不高。

有什麼想法?

回答

14

好吧我已經把這個問題帶到了死地,碰到sample code from Apple他們在那裏做了完全相同的事情(在工具欄按鈕上切換播放/暫停按鈕圖形)。但不是使用內置播放和暫停標識符UIBarButtonItem,而是使用自定義UIButton並切換自定義圖像。

所以,如果蘋果經過上一個UIButton創建和切換自定義圖像,而不是內置的播放和暫停UIBarButtonItem按鈕,那麼我認爲這是相當安全的,說沒有辦法以編程方式改變UIBarButtonItem的標識符的麻煩。

這是他們(蘋果)做什麼來切換圖像按下按鈕時:

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

替換任何BOOL你想握住你的按鈕的狀態p.playing。 playButton是工具欄中的自定義UIButtonpauseBtnBGplayBtnBG是要切換的圖像。

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一個工具欄,當有人點擊刷新我想它變爲停止。工具欄只有一個靈活的空間和一個按鈕 - 右對齊按鈕 - 所以我抓住了舊按鈕的引用,使用與舊選擇相同的選擇器創建一個新的按鈕,重置標籤欄上的按鈕,然後釋放原始按鈕。

不是最漂亮的,但是您可以使用所有標準按鈕而不必重寫按鈕類(es)。

+0

蘋果做到這一點的StitchedStreamPlayer例如:http://developer.apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010092 – pablasso 2011-09-06 15:18:27

+0

雖然技術上不是'當OP在之後改變'UIBarButtonSystemItem'時,這個答案確實允許一個系統項目的*替換*。 – 2012-04-30 16:11:23

+0

雖然在這個例子中,新的'UIBarButtonItem'應該在被放入數組之前被初始化,所以它可以被正確地釋放。 – 2012-05-01 08:28:32

0

2堆棧工具欄呢?然後你可以在頂部有一些系統按鈕,而其他的則在底部。如果按下播放按鈕,則只需隱藏頂部工具欄。

+0

他正在改變圖像或交換按鈕,沒有工具欄消失。 – JoshDM 2013-04-19 18:31:36

+0

@JoshDM但是,如果工具欄消失,顯示給用戶的按鈕將會改變。此外,在這些情況下,通常情況下你沒有一個按鈕,而是一組必須更改的按鈕,所以我發現使用標準的UIBarButtonItem而不是創建和切換定製的UIButton可以更容易地使用兩個不同的工具欄。也更容易'隱藏'一個視圖。但你說得對,並不是問題的答案,它是提問者問題的答案。 – FranMowinckel 2013-10-14 09:45:29