Iphone 使用MPVolumeView后,如何重新打开系统卷覆盖?
我正在为非本地声音格式构建一个音频播放器。应用程序的层次结构基于iPod.app。它有多个Iphone 使用MPVolumeView后,如何重新打开系统卷覆盖?,iphone,ios,media-player,Iphone,Ios,Media Player,我正在为非本地声音格式构建一个音频播放器。应用程序的层次结构基于iPod.app。它有多个UITableView,还有一个UIView(TrackView),使用MPVolumeView允许用户更改屏幕上的音量。直到第一次看到TrackView时,使用硬件按钮更改音量将按预期(和所需)显示系统音量叠加。当TrackView可见时,这些覆盖不会出现,因为MPVolumeView会在使用硬件按钮(也需要)更改音量时更新 问题是:一旦退出TrackView,使用硬件音量按钮时,系统音量叠加不会出现。我
UITableView
,还有一个UIView
(TrackView
),使用MPVolumeView
允许用户更改屏幕上的音量。直到第一次看到TrackView
时,使用硬件按钮更改音量将按预期(和所需)显示系统音量叠加。当TrackView
可见时,这些覆盖不会出现,因为MPVolumeView
会在使用硬件按钮(也需要)更改音量时更新
问题是:一旦退出TrackView
,使用硬件音量按钮时,系统音量叠加不会出现。我曾尝试通过编程方式分配、创建和添加TrackViewController视图中的MPVolumeView
将出现:
,然后在TrackViewController视图中删除、释放和取消相同的MPVolumeView
将消失:
iPod.app中不会出现这种情况。退出包含MPVolumeView
的视图后,使用硬件音量按钮时,系统音量叠加显示
我错过了什么
更新2:这似乎是MPVolumeView中的一个bug,它是在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
您需要在Xcode中将MediaPlayer框架添加到您的项目中,并在Interface builder中打开MainWindow.xib,以添加UIView和UIButton IBOutlets,并将iAction连接到UIButton。这是早期版本iOS中私有框架的一个问题 我理解您希望为此制定解决方案,但这会导致您的代码操纵私有框架,使您的应用程序无法通过批准
幸运的是,出现此错误的版本跨度很短,使用这些版本的设备数量正在以分钟为单位不断减少。您可以通过编程方式增加和减少设备体积,如:
- (void)setVolume:(float)Level
{
OSStatus errorMsg = AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, Level);
if (errorMsg) {
NSLog(@"%d", errorMsg);
}
}
这似乎是运行iOS 4.1的iPod Touchs上的一个问题。我的iPad上运行的iOS 3.2应用程序没有出现这个问题。我正在将我的一个iPodtouch升级到iOS4.2,看看问题是否已经解决。(在任何情况下,我仍然在寻找解决方案,因为4.1上的iPod.app没有表现出这种行为。)这个问题似乎在iOS 4.2中得到了解决,但如果有人有早期版本的解决方案,我仍然感兴趣。我在4.2.1上遇到了类似的问题,我的MPVolumeView并不总是可见的,但会在屏幕上点击时显示和隐藏。首次加载“我的曲目视图”时,音量视图不可见,系统音量叠加显示以响应音量按钮的更改。显示MPVolumeView后,卷覆盖将不再显示(无论MPVolumeView随后是否隐藏),直到视图从视图中删除并再次添加。
- (void)setVolume:(float)Level
{
OSStatus errorMsg = AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, Level);
if (errorMsg) {
NSLog(@"%d", errorMsg);
}
}