MPVolumeView, избегайте отображения «Нет доступного объема» - PullRequest
3 голосов
/ 13 мая 2010

У меня есть проект с MPVolumeView в нем. Он настроен и работает, единственное, что, когда я отключаю звук устройства, вместо MPVolumeView появляется текст "No Volume Available". Я бы хотел, чтобы ползунок MPVolumeView был отключен, когда устройство отключено.

VolumeView инициализируется в представлении volumeBounds с границами этого представления.

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:volumeBounds.bounds] autorelease];
[volumeBounds addSubview:volumeView]; 
[volumeView sizeToFit];

Спасибо:)

Если вы хотите помочь мне с чем-то еще, проверьте этот вопрос

Ответы [ 2 ]

3 голосов
/ 22 мая 2010

Используйте AudioServices для прослушивания громкости оборудования. Когда громкость упадет до нуля, установите альфа MPVolumeSlider на ноль и поместите свой собственный отключенный UISlider в ту же позицию. Сделайте скин своего слайдера, чтобы он выглядел как слайдер громкости.

AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume , ... );

kAudioSessionProperty_AudioRouteChanged также может быть полезным.

Если вы идете по иерархии представления под MPVolumeView, вы должны найти UISlider. Если нет или если он скрыт, вы знаете, что строка отключения звука.

Edit:

Этот описывает прототип функции для вашего слушателя. Чтобы передать сообщение экземпляру вашего класса, выполните что-то похожее на:

void MyPropertyListener ( void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData );

void MyPropertyListener ( void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData ) {
  if ( inID == kAudioSessionProperty_CurrentHardwareOutputVolume ) {
    Float32 volume = *(Float32 *)inData;
    [(MyDelegateClass *)inClientData hardwareVolumeChanged:volume];
  }
}

AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume ,
  MyPropertyListener , aDelegateInstance );
1 голос
/ 03 марта 2015

Я остановился на этом решении для простоты.

В Objective-C:

[UILabel appearanceWhenContainedIn: [MPVolumeView class], nil].textColor = [UIColor clearColor];

В Swift:

UILabel.appearanceWhenContainedWithin([MPVolumeView.self]).textColor = UIColor.clearColor()

См. Следующий ответ для appearanceWhenContainedWithin метода: появление при содержании в Swift

Он просто скрывает текст «Нет тома» вместо замены на отключенный UISlider, чтобы не беспокоиться о выравнивании между ползунком MPVolumeView и UISlider.

AVPlayer имеет свойство volume, но его документ гласит:

Используйте это свойство для управления громкостью звука проигрывателя относительно других аудиовыходов.

AVAudioSession имеет свойство только для чтения outputVolume, а его документ гласит:

Общесистемная выходная громкость может быть установлена ​​непосредственно только пользователем; чтобы обеспечить регулировку громкости в вашем приложении, используйте класс MPVolumeView.

Что касается ограничений, простое решение (или обходной путь) - просто установить цвет текста для очистки.

...