Je suis en train de construire un lecteur audio pour un format sonore non natif. La hiérarchie de l'application est basée sur l'iPod.app. Elle comporte un certain nombre de UITableView
et un UIView
( TrackView
) qui utilise un MPVolumeView
pour permettre à l'utilisateur de modifier le volume à l'écran. Jusqu'à la première fois TrackView
devient visible ; changer le volume à l'aide des boutons matériels affiche la superposition du volume du système comme prévu (et souhaité). Lorsque TrackView
est visible, ces superpositions n'apparaissent pas puisque l'option MPVolumeView
mises à jour lors du changement de volume avec les boutons matériels (également souhaité).
Voilà le problème : une fois que vous avez fait marche arrière sur TrackView
la superposition du volume du système n'apparaît pas lorsque vous utilisez les boutons de volume du matériel. J'ai essayé de programmer l'allocation, la création et l'ajout de l'icône de volume du système. MPVolumeView
en TrackViewController viewWillAppear:
et ensuite les retirer, les libérer et les réduire à néant. MPVolumeView
en TrackViewController viewWillDisappear:
.
Cela ne se produit pas dans l'application iPod.app. Une fois que l'on sort de la vue qui contient un objet MPVolumeView
les superpositions de volume du système s'affichent lorsque vous utilisez les boutons de volume du matériel.
Qu'est-ce que je rate ?
Mise à jour 2 : Il semble s'agir d'un bogue dans MPVolumeView qui a été introduit quelque temps après iOS 3.2 et corrigé dans 4.2.
Mise à jour : J'ai fait une réduction simple à partir du projet d'application par défaut basé sur les fenêtres qui présente le même comportement. Une fois qu'un MPVolumeView devient visible, les superpositions de volumes du système ne sont plus jamais vues dans l'application.
VolumeAppDelegate.h :
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface VolumeAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
IBOutlet UIView *volumeView;
IBOutlet MPVolumeView *mpVolumeView;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
-(IBAction)toggleVolumeView:(id)sender;
@end
VolumeAppDelegate.m :
#import "VolumeAppDelegate.h"
@implementation VolumeAppDelegate
@synthesize window;
-(IBAction)toggleVolumeView:(id)sender{
if (mpVolumeView == nil){
mpVolumeView = [[MPVolumeView alloc] initWithFrame:volumeView.bounds];
[volumeView addSubview:mpVolumeView];
}
else{
[mpVolumeView removeFromSuperview];
[mpVolumeView release];
mpVolumeView = nil;
}
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self.window makeKeyAndVisible];
mpVolumeView = nil;
return YES;
}
- (void)dealloc {
[window release];
[super dealloc];
}
@end
Vous devrez ajouter le cadre MediaPlayer à votre projet dans Xcode et ouvrir MainWindow.xib dans Interface builder pour ajouter les IBOutlets UIView et UIButton et relier l'IBAction à l'UIButton.