2011-08-13 8 views
-1

問題:UIButtonのタイトルカラーを正しく変更するにはどうすればよいですか?

私は、一連のボタンプレスを「再生」し、再生された各ボタンに関連付けられたサウンドを再生したいと考えています。

現在、私は音を再生することができますが、音が再生されるのと同時にUIButtonsのTitle Colorも簡単に変更したいと思います。

どのボタンが押されたかを示す配列をループするコードを記述しました。このforループでは、サウンドは正しく再生されますが、ループのあるメソッドが終了するまで、ボタンのタイトルの色は変わりません。

つまり、ループ中にサウンドは再生されますが、ループが完全に終了してコードが抜けるまで、タイトルテキストの色は変わりません。私はブレークポイントを設定し、その動作を見てこれを決めました。

私が画面に表示されるのは、シーケンスを開始するためにボタンを押し、サウンドが再生され、サウンドが再生されなくなった後、ボタンはタイトルカラーを一度に変更します。

サウンド再生時に各ボタンのタイトルカラーが変更されるようにするにはどうすればよいですか?

これは何らかの意味があることを願っており、このすべてを読む時間を費やしていただきありがとうございます。 :)

+0

あなたは、どのボタンが押されたのかを見つけるためにボタンをループしていると言いましたが、なぜループを使用するのですか?代わりにidを取得してから、tagプロパティを使うことができます。それに基づいて、ボタンのタイトルカラーを最初に変更してから、PlayBackを起動することができます....申し訳ありません。もし私がどこかに間違っていますが、それは問題を作成します... – DShah

答えて

2

すべてのサウンドとアニメーションをループすると、ループが非常に速く実行され、アニメーションのタイミングを制御できなくなります。

代わりにNSTimerを使用し、タイマーが起動するたびに慎重に各サウンドとアニメーションを実行できます。

+0

私はその考えMundiが好きです!そして、あなたが私がやろうとしていることに似た何かをやったことがあなたのために働いたと言われて以来、私はそれを働かせることができるはずです! :)私はタイマを使用することは決してなかった。 –

+0

ちょっとムンディ、これはほとんど今働いている!サウンドが再生されると、タイトルテキストの色が変わります。驚くばかり。しかし、サウンドを再生した後に元の色に戻すためのテキストをタイトルにしたいと思います。そのために別のタイマーを使用する必要がありますか? –

+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引数をYESに設定してください。 –

1

メインスレッドでUIの更新が続行されている間、バックグラウンドスレッドでサウンドを再生しようとする場合があります。 playSound

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

、あなたはメモリリークが発生しないように、新しい自動解放プールを確立することを忘れないでください。

+0

感謝ムンディ、私はそれを試してみましょう。たぶん、あなたの答えとXenの組み合わせは、私が探しているものを私に手に入れます... –

+0

ムンディは、まったく行動を変えていないようです。上記と同じ問題がまだ残っています... –

+0

私は昨日のようなものをプログラミングしました。つまり、ビジュアルとアコースティックの両方のフィードバックを使ってピアノの鍵を演奏します。しかし、私は全くスレッドを使用していません。タイマーが起動すると、キーボタンの画像が変更され、AVAudioPlayerで再生されます。だから、おそらくループとなるのではなく、NSTimerとカウンタを使ってアニメーションを再生してボタンを押さなければなりません。 – Mundi

関連する問題