Как снова включить наложение системной громкости после использования MPVolumeView? - PullRequest
54 голосов
/ 28 ноября 2010

Я создаю аудиоплеер для не родного звукового формата.Иерархия приложения основана на iPod.app.Он имеет число UITableView и один UIView (TrackView), который использует MPVolumeView, чтобы позволить пользователю изменять громкость на экране.До тех пор, пока в первый раз TrackView не станет видимым, изменение громкости с помощью аппаратных кнопок отображает наложение громкости системы, как и ожидалось (и желательно).Когда виден TrackView, эти наложения не отображаются, поскольку MPVolumeView обновляется при изменении громкости с помощью аппаратных кнопок (также желательно).

Вот проблема: после выхода из TrackViewНаложение громкости системы не отображается при использовании аппаратных кнопок громкости.Я попытался программно выделить, создать и добавить MPVolumeView в TrackViewController viewWillAppear:, а затем удалить, выпустить и обнулить тот же MPVolumeView в TrackViewController viewWillDisappear:.

Этого не происходит в iPod.приложение.После возврата из представления, содержащего 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

YouВам нужно будет добавить платформу MediaPlayer в ваш проект в Xcode и открыть MainWindow.xib в Интерфейсном конструкторе, чтобы добавить IBOutlets UIView и UIButton и подключить IBAction к UIButton.

Ответы [ 2 ]

1 голос
/ 10 мая 2012

К сожалению, это проблема частной платформы в более ранних версиях iOS.

Я понимаю, что вы хотите найти решение для этого, но это заставит ваш код манипулировать частной платформой, делая вашприложение не может пройти утверждение.

К счастью, диапазон версий, в котором возникла эта ошибка, невелик, и число устройств, находящихся в обращении с этой версией, с каждой минутой становится все меньше.

0 голосов
/ 23 июля 2013

Вы можете увеличивать и уменьшать громкость устройства программно, например:

- (void)setVolume:(float)Level
{

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

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

}
...