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;}];

将移动滑块的位置,然后在没有动画的情况下更改其值。

  • 我尝试通过调用第二个动画

    [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>

注意动画部分,它现在不应该存在(描述是从 [self animateVolume] 记录的,它的调用延迟为 0.3 秒)。

我知道这是一个奇怪的问题,但我非常感谢您的帮助。

谢谢 :) 丹

更新

正如 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

7

如果你想为滑块值的变化设置动画,你应该使用setValue:animated:而不是直接设置 .value 。更改 UIView 动画块内的 volumeSlider.value 可能会干扰动画。

于 2013-10-22T17:51:38.023 回答