使用MPVolumeView后,如何重新打开系统音量叠加层?

我正在为非本机声音格式构buildaudio播放器。 应用程序的层次结构基于iPod.app。 它有一些UITableView和一个UIViewTrackView ),它使用MPVolumeView来允许用户改变屏幕上的音量。 直到第一次TrackView变为可见时,使用硬件button更改音量按预期(和所需)显示系统音量叠加。 当TrackView可见时,由于MPVolumeView在使用硬件button(也是所需)更改音量时会更新,因此不会显示这些叠加层。

问题是:一旦退出TrackView ,使用硬件音量button时系统音量叠加就不会出现。 我已经尝试编程分配,创build和TrackViewController viewWillAppear:添加MPVolumeView TrackViewController viewWillAppear:然后删除,释放和在TrackViewController viewWillAppear:删除相同的MPVolumeView TrackViewController viewWillDisappear: MPVolumeView

这在iPod.app中不会发生。 退出包含MPVolumeView的视图后,使用硬件音量button时系统音量叠加显示。

我错过了什么?


更新2:这似乎是在iOS 3.2之后引入的MPVolumeView中的一个错误,并在4.2中修复。


更新:我从默认的基于窗口的应用程序项目做了一个简单的减less,展现了相同的行为。 一旦MPVolumeView变得可见,系统卷覆盖从未在应用程序中再次看到。

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 

您需要将MediaPlayer框架添加到Xcode中的项目中,并在“界面”构build器中打开MainWindow.xib以添加UIView和UIButton IBOutlet,并将IBAction连接到UIButton。

这是iOS早期版本中的私有框架的一个难题。

我理解您希望为此做出解决scheme,但这会导致您的代码操纵私有框架,从而导致您的应用无法通过审批。

幸运的是,有这个错误的版本跨度很短,而且随着这些版本的stream通设备数量逐渐变less。

您可以通过编程方式增加和减less设备音量,如:

 - (void)setVolume:(float)Level { OSStatus errorMsg = AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, Level); if (errorMsg) { NSLog(@"%d", errorMsg); } }