是否有一般模板或教程或网页描述创建UIPickerview的过程,该过程选择短声音文件并在选择时播放或播放?感谢
答案 0 :(得分:2)
您的选择器视图需要一个委托/数据源类 - 实现协议UIPickerViewDelegate
和UIPickerViewDataSource
的东西。这可以是您处理其他所有内容的视图控制器或单独的类 - 无论哪种方式,将UIPickerView
的{{1}}和delegate
属性设置为该类的实例。< / p>
该类应该有三个实例变量 - 一个用于包含声音的NSArray dataSource
,一个NSTimer soundArr
用于在声音播放之前选择后提供延迟(下面有更多内容),以及一个AVAudioPlayer timer
播放选定的声音(您需要导入AVFoundation框架 - 它仅在2.2中可用,因为声音播放过去要复杂得多)。
当您第一次加载声音时(在您的控制器类的-init方法或其他任何方法中),将它们与您希望它们显示的标题一起放在一个数组中,如下所示:
NSBundle *bdl = [NSBundle mainBundle]; soundArr = [[NSArray alloc] initWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"Sound One",@"title",[NSURL URLWithString:[bdl pathForResource:@"sound1" ofType:@"wav"]],@"url",nil], [NSDictionary dictionaryWithObjectsAndKeys:@"Sound Two",@"title",[NSURL URLWithString:[bdl pathForResource:@"sound2" ofType:@"wav"]],@"url",nil], nil];
您需要实施的方法是:
audioPlayer
- 应返回-pickerView:numberOfRowsInComponent:
soundArr
- 应该返回-pickerView:titleForRow:forComponent:
[[soundArr objectAtIndex:row] objectForKey:@"title"]
- 应返回1,因为您只有一列(组件)可供选择-numberOfComponentsInPickerView:
- 见下文您不希望在调用行选择委托方法时立即启动声音,或者在用户滚动选择器时连续播放声音片段。相反,使用延迟很短的计时器,如下所示:
if(timer != nil) { [timer invalidate]; // remove any timer from an earlier selection timer = nil; } timer = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(startSoundAtURL:) userInfo:[[soundArr objectAtIndex:row] objectForKey:@"url"] repeats:NO]; // and create the new one
然后,实现一个-startSoundAtURL:方法,设置AVAudioPlayer播放该声音:
- (void)startSoundAtURL:(NSURL *)url { if(audioPlayer != nil) { [audioPlayer stop]; [audioPlayer release]; } NSError *err; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err]; if(err != nil) { NSLog([err description]); return; } [audioPlayer play]; }
那几乎应该这样做。