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