我正在为非本地声音格式构建音频播放器。该应用程序的层次结构基于iPod.app。它具有许多UITableView
和一个UIView
(TrackView
),使用MPVolumeView
允许用户在屏幕上更改音量。在首次看到TrackView
之前,使用硬件按钮更改音量将按预期(和期望)显示系统音量叠加。当TrackView
可见时,由于使用硬件按钮更改音量时MPVolumeView
更新(也需要),因此这些叠加层不会出现。
问题出在这里:一旦退出TrackView
,使用硬件音量按钮时,系统音量覆盖将不会出现。我尝试以编程方式在MPVolumeView
中分配,创建和添加TrackViewController viewWillAppear:
,然后在MPVolumeView
中删除,释放和将相同的TrackViewController viewWillDisappear:
无效。
在iPod.app中不会发生这种情况。一旦退出包含MPVolumeView
的 View ,则使用硬件音量按钮时将显示系统音量覆盖图。
我想念什么?
更新2:这似乎是MPVolumeView中的一个错误,该错误在iOS 3.2之后的某个时间引入并在4.2中修复。
更新:我从表现出相同行为的默认基于窗口的应用程序项目中进行了简单还原。一旦看到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
您需要在Xcode中将MediaPlayer框架添加到您的项目中,并在“接口(interface)”构建器中打开MainWindow.xib以添加UIView和UIButton IBOutlets并将IBAction连接到UIButton。
最佳答案
遗憾的是,这是iOS早期版本中的私有(private)框架的问题。
我了解您希望为此提供解决方案,但这会导致您的代码操纵私有(private)框架,从而使您的应用无法通过批准。
幸运的是,出现此错误的版本跨度很短,并且流通有这些版本的设备的数量每分钟都在减少。
关于iphone - 使用MPVolumeView后如何重新打开系统卷覆盖图?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4297176/