使用 MPVolumeView 后如何重新打开系统音量覆盖?

Posted

技术标签:

【中文标题】使用 MPVolumeView 后如何重新打开系统音量覆盖?【英文标题】:How do I turn the system volume overlay back on after using MPVolumeView? 【发布时间】:2011-05-16 21:06:45 【问题描述】:

我正在为非本地声音格式构建音频播放器。应用程序的层次结构基于 iPod.app。它有许多UITableView 和一个UIView (TrackView),它使用MPVolumeView 允许用户更改屏幕上的音量。直到TrackView 第一次变为可见时,使用硬件按钮更改音量会按预期(和期望)显示系统音量覆盖。当TrackView 可见时,这些覆盖不会出现,因为MPVolumeView 在使用硬件按钮更改音量时会更新(也是需要的)。

问题是:一旦退出TrackView,使用硬件音量按钮时系统音量覆盖不会出现。我尝试以编程方式在TrackViewController viewWillAppear: 中分配、创建和添加MPVolumeView,然后在TrackViewController viewWillDisappear: 中删除、释放和取消相同的MPVolumeView

这不会发生在 iPod.app 中。一旦退出包含MPVolumeView 的视图,使用硬件音量按钮时系统音量覆盖显示。

我错过了什么?


更新 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 builder 中打开 MainWindow.xib 以添加 UIView 和 UIButton IBOutlets 并将 IBAction 连接到 UIButton。

【问题讨论】:

这似乎是运行 iOS 4.1 的 iPod touch 上的问题。在装有 iOS 3.2 的 iPad 上运行的相同应用程序不会出现此问题。我现在正在将我的一台 iPod touch 更新到 iOS 4.2,看看问题是否已得到解决。 (无论如何,我仍在寻找解决方案,因为 4.1 上的 iPod.app 没有表现出这种行为。) 这个问题似乎在 iOS 4.2 中得到解决,但如果有人有早期版本的解决方案,我仍然感兴趣。 我在 4.2.1 上遇到了类似的问题,我的 MPVolumeView 并不总是可见,而是显示和隐藏以响应屏幕上的点击。当我第一次加载相当于您的跟踪视图时,音量视图不可见,并且系统音量覆盖显示以响应音量按钮的变化。显示 MPVolumeView 后,卷覆盖不再出现(无论 MPVolumeView 随后是否隐藏),直到视图从视图中移除并再次添加。 【参考方案1】:

很遗憾,这是早期 iOS 版本中私有框架的问题。

我了解您希望为此制定解决方案,但这会导致您的代码操纵私有框架,使您的应用无法通过审批。

幸运的是,出现此错误的版本跨度很短,并且与这些版本一起流通的设备数量正在逐分钟减少。

【讨论】:

【参考方案2】:

您可以通过以下方式以编程方式增加和减少设备音量:

- (void)setVolume:(float)Level


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

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


【讨论】:

以上是关于使用 MPVolumeView 后如何重新打开系统音量覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer、MPVolumeView 和 Volume HUD

如何扩大 MPVolumeView 路由按钮区域?

请问SSD装了系统后如何重新分区?

带有 XCode 4 的 MPVolumeView(故事板)

如何在 iOS 中自定义 MPVolumeView?

如何正确设置 MPVolumeView 的最大和最小图像