使用MPVolumeView后,如何重新打开系统音量叠加层?
我正在为非本机声音格式构buildaudio播放器。 应用程序的层次结构基于iPod.app。 它有一些UITableView
和一个UIView
( TrackView
),它使用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); } }