2010-11-28 34 views
54

我正在为非本地声音格式构建音频播放器。该应用程序的层次结构基于iPod.app。它有一个UITableView和一个UIViewTrackView),它使用MPVolumeView来允许用户更改屏幕上的音量。直到第一次使用硬件按钮TrackView变为可见时,使用硬件按钮显示系统音量覆盖图(如需要)。当TrackView可见时,由于MPVolumeView在使用硬件按钮(也是所需)更改音量时进行更新,因此不会显示这些覆盖图。如何在使用MPVolumeView后重新打开系统音量叠加层?

问题出在这里:一旦您退出TrackView,使用硬件音量按钮时不会出现系统音量叠加。我尝试编程分配,创建并添加TrackViewController viewWillAppear:中的MPVolumeView,然后删除,释放和删除TrackViewController viewWillDisappear:中的相同MPVolumeView

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

我错过了什么?


更新2:这似乎是被的iOS 3.2之后的某个引入并固定在4.2 MPVolumeView的错误。


更新:我从表现出相同的行为默认的基于窗口的应用程序项目一个简单的减少。一旦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和Interface Builder中打开的MainWindow.xib到添加UIView和UIButton IBOutlets并将IBAction连接到UIButton。

+0

这似乎是对iPod的一个问题倒是运行iOS 4.1。运行在iOS 3.2的iPad上的相同应用程序不会出现此问题。我正在更新我的一个iPod触摸到iOS 4.2以查看问题是否已得到解决。 (在任何情况下,我仍然在寻找解决方案,因为4.1上的iPod.app不会出现这种行为。) – 2010-11-28 14:48:03

回答

1

这可悲的是iOS早期版本中的私有框架的一个问题。

我知道您希望为此做出解决方案,但这会导致您的代码操纵私人框架,从而导致您的应用无法通过审批。

幸运的是,出现此错误的版本范围很短,并且随着这些版本的流通设备数量逐渐变少。

0

可以增加通过编程像减少设备体积:

- (void)setVolume:(float)Level 
{ 

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

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

}