Я создаю аудиоплеер для неродного звукового формата. Иерархия приложений основана на iPod.app. Он имеет число UITableView
и один UIView
(TrackView
), который использует MPVolumeView
, чтобы позволить пользователю изменять громкость на экране. До появления первого раза TrackView
изменение громкости с помощью аппаратных кнопок отображает оверлей громкости системы, как и ожидалось (и желательно). Когда видна TrackView
, эти оверлеи не появляются, поскольку обновления MPVolumeView
обновляются при изменении громкости с помощью аппаратных кнопок (также желательно).
Здесь проблема: после выхода из TrackView
оверлей системных томов не появляется при использовании кнопок аппаратного уровня громкости. Я пробовал программно распределять, создавать и добавлять MPVolumeView
в TrackViewController viewWillAppear:
, а затем удалять, освобождать и ноль того же MPVolumeView
в TrackViewController viewWillDisappear:
.
Это не происходит в 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
Вам нужно добавить среду MediaPlayer в свой проект в Xcode и открыть MainWindow.xib в построителе интерфейса, чтобы добавить IBOutlets UIView и UIButton и подключить IBAction к UIButton.