2011-08-13 20 views
-1

問題:如何正確更改UIButtons的標題顏色?

我想要「回放」一系列按鈕並播放與每個播放按鈕關聯的聲音。

目前,我可以「播放」聲音,但我還想在播放聲音的同時簡短地更改UIButtons的標題顏色。

我已經編寫了代碼,它循環顯示一個數組,指示哪些按鈕被按下。在這個for循環中,聲音播放正確,但是沒有任何按鈕標題只有在循環方法退出之後纔會改變顏色。

即在循環期間聲音播放,但標題文本不會改變顏色,直到循環完全退出並且代碼退出該方法。我通過設置斷點並觀察行爲來確定這一點。

我在屏幕上看到的是 - 我按下按鈕開始序列,播放聲音,然後聲音退出播放後,按鈕一次更改其標題顏色。

如何獲取它,以便每個按鈕只在聲音播放時更改其標題顏色?

我希望能夠提供某種意義,並感謝您花時間閱讀所有這些內容。 :)

+0

你說你正在循環按鈕來查找哪個按鈕被按下......但爲什麼你使用循環?相反,你可以獲取id,然後使用標籤屬性...並基於此,您可以先更改按鈕的標題顏色,然後啓動PlayBack ....抱歉如果我錯了某處,但請將代碼的一部分造成問題... – DShah

回答

2

如果循環播放所有聲音和動畫,則循環執行得太快,並且無法控制動畫的時間。

取而代之,您可以使用NSTimer,並且每次定時器觸發時都謹慎地做每個聲音和動畫。

+0

我喜歡蒙迪的想法!而且既然你說你已經做了類似於我想要做的事情,並且它對你有用,那麼我應該能夠讓它工作! :)我從來沒有想過使用計時器。 –

+0

Hey Mundi,現在差不多正在工作!現在標題文本在播放聲音時正在改變顏色。真棒。但是,現在,我希望標題文字在聲音播放後變回原來的顏色。我需要使用另一個計時器嗎? –

+0

@Terry - 是的,我是這麼做的。當你改變顏色時,你可以發送一個不重複的定時器來改變它。 - 請考慮接受答案。 ;-) – Mundi

1

我假設你的意思是你的按鈕不會在正確的時間改變顏色,即使你的代碼在正確的地方是正確的嗎?這是因爲圖紙沒有更新向右走,所以你需要的東西是這樣的:

[self performSelectorOnMainThread:@selector(changeColor) withObject:nil waitUntilDone:YES]; 

- (void)changeColor 
{ 
    [UIButton setTitleColor:YOUR_COLOR forState:UIControlStateNormal]; 
} 

直到顏色被更新時將暫停程序,並重繪使其正確顯示。

+0

酷!我覺得是這樣的。現在嘗試。 –

+0

似乎不起作用。我得到了和我描述的一樣的行爲。我一直使用NSThread sleepForTimeInterval來確保一個聲音在另一個聲音之前完成,所以我認爲你的方法也可以幫助完成這項工作。當我擺脫睡眠時,聲音互相重疊,然後按鈕標題改變顏色。 –

+0

剛剛通過斷點驗證,直到循環的方法退出後,顏色纔會改變。還驗證了選擇器正在被正確調用。這似乎並不像我們在等待。還要確保將waitUntilDone arg設置爲YES。 –

1

當UI更新在主線程中繼續時,您可能會嘗試使後臺線程中的聲音播放起來。

[self performSelectorInBackground:@selector(playSound:) withObject:sound]; 

playSound,不要忘了建立一個新的自動釋放池,這樣你就不會泄漏內存。

+0

謝謝Mundi,我會盡力的。也許你的答案和Xen的組合會讓我找到我想要的...... –

+0

Mundi,似乎並沒有改變行爲。仍然有上述相同的問題... –

+0

我剛剛編程了這樣的事情昨天,即鋼琴鍵,自己玩,視覺和聽覺反饋。但是,我根本沒有使用任何線程。當定時器啓動時,我改變了我的按鍵的圖像,然後用AVAudioPlayer播放聲音。所以也許你應該用「NSTimer」和計數器來計時播放和按鈕動畫,而不是循環播放。 – Mundi