我正在为非本地声音格式构建音频播放器。该应用程序的层次结构基于 iPod.app。它有许多 UITableView
和一个 UIView
(TrackView
),它使用 MPVolumeView
来允许用户更改屏幕上的音量。在 TrackView
第一次变得可见之前,使用硬件按钮更改音量会按预期(和期望)显示系统音量覆盖。当 TrackView
可见时,这些叠加层不会出现,因为在使用硬件按钮更改音量时 MPVolumeView
会更新(同样需要)。
这就是问题所在:一旦您退出 TrackView
,使用硬件音量按钮时系统音量覆盖不会出现。我尝试以编程方式在 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
您需要将 MediaPlayer 框架添加到 Xcode 中的项目,并在界面生成器中打开 MainWindow.xib,以添加 UIView 和 UIButton IBOutlets,并将 IBAction 连接到 UIButton。
最佳答案
很遗憾,这是早期 iOS 版本中私有(private)框架的问题。
我理解你想为此做一个解决方案,但这会导致你的代码操纵私有(private)框架,导致你的应用无法通过审核。
幸运的是,出现此错误的版本跨度很短,并且使用这些版本的设备数量正在逐分钟减少。
关于iphone - 使用 MPVolumeView 后如何重新打开系统音量覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297176/