54 votes

Comment puis-je réactiver la superposition du volume du système après avoir utilisé MPVolumeView ?

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.

1voto

Nils Munch Points 4574

Il s'agit malheureusement d'un problème lié au cadre privé des versions antérieures d'iOS.

Je comprends que vous souhaitiez apporter une solution à ce problème, mais cela conduirait votre code à manipuler le cadre privé, ce qui rendrait votre application incapable de passer l'approbation.

Heureusement, l'intervalle de temps entre les versions qui présentaient cette erreur est court, et le nombre d'appareils en circulation avec ces versions s'amenuise de minute en minute.

0voto

Bipin Patel Points 170

Vous pouvez augmenter et diminuer le volume de l'appareil par voie programmatique comme :

- (void)setVolume:(float)Level
{

   OSStatus errorMsg = AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, Level);

   if (errorMsg) {
      NSLog(@"%d", errorMsg);
   }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X