こんにちは。開発担当のICTFです。
滑らかに値を操作できる事がUISliderの魅力ですが、逆に「ぴったりある値に設定する」事は苦手です。
例えば、音声の再生速度をUISliderで滑らかに変動させたい。しかし、ぴったり1倍の再生速度に戻せるようにもしたい。といった機能の実装にそのままUISliderを用いると少々不満が出てしまいます。
今回は滑らかに値を変更させつつも、ある値にぴったりと設定が可能なUISliderの実装方法をご紹介します。
次の仕様でサンプルの実装を行ないます。
- 再生速度の調整を行なうスライダー
- スライダーの値は0.5〜1.5
- デフォルトの値は1.0とする
- 基本的に滑らかに再生速度の変更を行うが、ぴったり1.0倍に合わせる事が出来るようにする
まずIBでUISliderを配置し、Outletsで_rateSliderと関連づけます。
次に以下のメソッドを宣言し、UISliderのイベントとして関連づけます。
-(IBAction) rateSlider_changeValue:(id)sender;
→Value Changed
-(IBAction) rateSlider_touchUp:(id)sender;
→Touch Up Inside と Touch Up Outside
各メソッドの実装に入ります。
// 再生速度スライダーの値変更
-(IBAction) rateSlider_changeValue:(id)sender
{
NSLog(@"rateValue: %f", _rateSlider.value);
if (_player) {
_player.rate = _rateSlider.value;
}
}
// 再生速度スライダーから指が離れたとき
-(IBAction) rateSlider_touchUp:(id)sender
{
// 一定範囲内の値であれば、1.0へ吸着させる
if (_rateSlider.value < 1.2 && _rateSlider.value > 0.8) {
_rateSlider.value = 1.0;
if (_player) {
_player.rate = 1.0;
}
}
}
_playerは、音声の再生を管理する為のインスタンスを保持しています。
_player.rateに_rateSlider.valueを設定する事で、再生速度を変更します。
スライダーから指が離れるとrateSlider_touchUpメソッドがコールされますが、その時に値が0.8より多く、1.2未満であれば1.0に設定するようにしています。
このマージンを多く取る程ストレス無く1.0に吸着できるようになりますが、逆にその範囲内の値に設定する事ができなくなりますので、目的に合わせて適切な値を設定して下さい。
コメントする