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

标签 iphone ios media-player

我正在为非本地声音格式构建音频播放器。该应用程序的层次结构基于 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/

相关文章:

ios - 调用 ZipZap 的 updateEntries 方法会导致 Swift 崩溃

ios - 如何防止在解析时重复输入?

java - Android:如果我继续按后退按钮并再次启动应用程序,Mediaplayer 会播放多次

jquery - 当我从我的 <a> 标签中点击它们时,如何让 mp3 播放器播放歌曲?

Java 媒体框架 x64 位

ios - 两个 View Controller 的委托(delegate)协议(protocol)

iphone - 使用 iOS 在 cordova 项目中打开本地 pdf

iphone - 如何将 "IN"运算符与谓词一起使用

iphone - 链接器命令失败,退出代码为1-不知道为什么

ios - 如何按字母顺序将 NSArray 拆分为 UITableView 部分