我正在实现在用户拖动UISlider时播放的声音效果。
在previous question中,我使用了 AudioServicesPlaySystemSound(),但无法暂停该类型的声音。当用户没有主动拖动滑块但尚未释放它时,我需要停止声音。
现在我正在使用 AVAudioPlayer 对象创建声音。我在我的View Controller中初始化它,如下所示:
@interface AudioLatencyViewController : UIViewController <AVAudioPlayerDelegate> {
AVAudioPlayer *player1;
}
@implementation AudioLatencyViewController
@property (nonatomic, retain) AVAudioPlayer *player1;
@synthesize player1;
-(void)viewDidLoad {
[super viewDidLoad];
// the sound file is 1 second long
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"tone1" ofType:@"caf"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[fileURL release];
self.player1 = newPlayer;;
[newPlayer release];
[self.player1 prepareToPlay];
[self.player1 setDelegate:self];
}
我有两种控制声音的方法。每当移动滑块时,第一个播放声音。它与Interface Builder中的UISlider的 Value Changed 事件相关联。
-(IBAction)sliderChanged:(id)sender;
{
// only play if previous sound is done. helps with stuttering
if (![self.player1 isPlaying]) {
[self.player1 play];
}
}
当用户释放滑块按钮时,第二种方法会停止声音。它连接到UISlider的 Touch Up Inside 事件。
-(IBAction)haltSound;
{
[self.player1 stop];
}
当滑动按钮移动然后快速释放时,此功能有效,但如果您按住按钮的时间超过两三秒,声音会重复(好),然后会分解(坏)。从那时起,声音将不再播放(超级糟糕)。
我尝试使用声音设置声音循环:
[self.player1 setNumberOfLoops:30];
...但这会导致应用程序冻结(加上锁定模拟器)。
如何调试此问题?
答案 0 :(得分:0)
当用户持有UISlider时,Value Changed会被多次调用(任何时候用户移动一点点)。我会改用Touch Down。
您可能仍希望尝试使用此路线的循环...
我喜欢在用户移动滑块时播放声音的想法。让我知道它是如何运作的。
deggstand@gmail.com