根据播放的音频,我有一个用作 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;
}];