再生されるオーディオに応じて、2つのスライダーとして機能するスライダーがあります.1つのタイプのオーディオ(ある種の音声ガイダンス)が無効になっている場合、音楽が再生され、スライダーが音楽の音量を制御します。
役割を変更すると、スライダーはその役割 (ガイダンス - ビューの上部、音楽 - 下部) に従って位置を変更し、その値 (音量) をそのタイプのサウンド (ガイダンス音または音楽音) の保存された音量値に調整します。 )。
私が探していた効果の種類は -
- を使用して、スライダーを新しい位置に移動します。
[UIView animateWithDuration]
- スライダーがその位置に達したら、再び を使用して、ボリュームを反映するように値を変更します
[UIView animateWithDuration]
。
最初はこんな感じで書きました~
[UIView animateWithDuration:0.3
animations:^{self.volumeSlider.frame = sliderFrame;}
completion:^(BOOL finished){
[UIView animateWithDuration:0.3
animations:^{self.volumeSlider.value = newValue;}
];
}];
これは iOS 6 シミュレーター (Xcode 4.6.3 を使用) では非常にうまく機能しましたが、iOS 7 を実行している私の携帯電話に変更すると、スライダーの位置が変わり、スライダーの値が新しい値にジャンプしました。Xcode 5 に付属の iOS 7 シミュレーターで実行した場合も同じ問題が発生したため、iOS 7 の問題であると推測されます。
私はいくつかの実験を行いましたが、すべて異なる結果でした:
- 「[UIView animateWithDuration:0.3 delay:0.3 options: animations: completion:]」でボリュームを設定してみましたが、つまり、完了部分ではないのですが、同じことが起こりました。
2 つのアニメーションだけを連続して (それぞれ別個のアニメーションとして、それぞれ遅延なく、次々に) 配置すると、結果はアニメーションの順序によって異なります。
[UIView animateWithDuration:0.3 animations:^{self.volumeSlider.value = newValue;}]; [UIView animateWithDuration:0.3 animations:^{self.volumeSlider.frame = sliderFrame;}];
スライダーとその値の両方を一緒に移動します。どちらもアニメーション化されていますが、
[UIView animateWithDuration:0.3
animations:^{self.volumeSlider.frame = sliderFrame;}];
[UIView animateWithDuration:0.3
animations:^{self.volumeSlider.value = newValue;}];
スライダーの位置を移動し、アニメーションなしで値を変更します。
2番目のアニメーションを呼び出してみました
[self performSelector:@selector(animateVolume:) withObject:nil afterDelay:0.3];
そして再び-スライダーが移動し、値がすぐに変更されました。
なぜ、ああ、なぜ?? それが役立つ場合、これは最初のアニメーションの前のスライダーの説明です-
<UISlider: 0xcc860d0; frame = (23 156; 276 35); autoresize = RM+BM;
layer = <CALayer: 0xcc86a10>; value: 1.000000>
そして、最初のアニメーションが終わった後 -
<UISlider: 0xcc860d0; frame = (23 78; 276 35); autoresize = RM+BM;
animations = { position=<CABasicAnimation: 0xbce5390>; };
layer = <CALayer: 0xcc86a10>; value: 0.000000>
アニメーション セクションに注意してください。これは、今では存在しないはずです (説明は、0.3 秒の遅延で呼び出される [self animateVolume] からログに記録されます)。
私はそれが奇妙な問題であることを知っていますが、助けていただければ幸いです。
ありがとう:)ダン
アップデート
Christopher Mann が示唆したように、UIView:animationWithDuration の値を変更することは公式の使用方法ではなく、正しい方法は UISlider の setValue:animated を使用することです。
ただ、今後そのような問題に遭遇する人のために、iOS 7 ではその方法に問題があり、場合によってはアニメーション化されていないようです (プロジェクトが Xcode で開始された場合、アニメーション化されないと思います)。 < 5)。問題とその解決方法については、ここで説明します。
この問題を解決した私のコードは次のとおりです。
[UIView animateWithDuration:0.3
animations:^{self.volumeSlider.frame = sliderFrame;}
completion:^(BOOL finished){
[UIView animateWithDuration:1.0 animations:^{
[self.volumeSlider setValue:newValue animated:YES];
}];
currentSliderMode = mode;
}];