Existe-t-il un modèle général ou un tutoriel ou une page Web décrivant la procédure à suivre pour créer un UIPickerview qui sélectionne des fichiers audio courts et les lit lors d'une sélection ou avec un lecteur? MerciExiste-t-il un modèle général pour créer un UIPickerview qui sélectionne les fichiers son courts?
Répondre
Vous aurez besoin d'une classe délégué/source de données pour votre vue sélecteur - quelque chose qui implémente les protocoles UIPickerViewDelegate
et UIPickerViewDataSource
. Cela peut être n'importe quel contrôleur de vue que vous avez gérer tout le reste ou une classe distincte - de toute façon, définissez les propriétés et dataSource
de UIPickerView
à votre instance de cette classe.
La classe doit avoir trois variables d'instance - un NSArray soundArr
pour contenir les sons, un NSTimer timer
pour fournir un retard après la sélection avant la lecture du son (plus de détails ci-dessous), et un AVAudioPlayer audioPlayer
pour jouer le son sélectionné (pour lequel vous aurez besoin d'importer le framework AVFoundation - il n'est disponible qu'en 2.2, car la lecture du son était beaucoup plus compliquée).
Lorsque vous chargez les sons (dans votre méthode -init de classe contrôleur ou autre), bâton « em dans un tableau avec le titre que vous les voulez afficher, quelque chose comme ceci:
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];
Le les méthodes que vous aurez besoin de mettre en œuvre sont les suivants:
-pickerView:numberOfRowsInComponent:
- doit retourner la taille desoundArr
-pickerView:titleForRow:forComponent:
- devrait revenir[[soundArr objectAtIndex:row] objectForKey:@"title"]
-numberOfComponentsInPickerView:
- doit retourner 1, puisque vous avez seulement une colonne (composant) pour sélectionner-pickerView:didSelectRow:inComponent:
- voir ci-dessous
Vous ne voulez pas le son de démarrer immédiatement lorsque le row- La méthode delegate de sélection est appelée, ou des extraits de sons sont lus en continu lorsque l'utilisateur fait défiler le sélecteur. Au lieu de cela, utilisez une minuterie avec un court délai, quelque chose comme ceci:
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
Ensuite, mettre en œuvre une -startSoundAtURL: méthode qui met en place le AVAudioPlayer à jouer ce son:
- (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]; }
Cela devrait à peu près fais le.