7

再生されるオーディオに応じて、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;
}];
4

1 に答える 1