Могу ли я использовать пользовательский слайдер для управления громкостью? - PullRequest
3 голосов
/ 19 июля 2010

Как я знаю, MPVolumeView можно добавить в мое приложение для изменения громкости. Но теперь я хочу контролировать громкость с помощью собственного ползунка.Может быть, я мог бы подойти сам, если бы MPVolume был подклассом uislider, действительно, это подкласс uiview.Попросите совета, чтобы реализовать мою идею, большое спасибо.

Ответы [ 6 ]

4 голосов
/ 19 июля 2010
UIView *a=[[UIView alloc] init];
    for (UIView *view in [volumeSlider subviews]) {
        if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
            a=view;
            [(UISlider *)a setThumbImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];
            [(UISlider *)a setMinimumTrackImage:[UIImage imageNamed:@"volume2.png"]  forState:UIControlStateNormal];
            [(UISlider *)a setMaximumTrackImage:[UIImage imageNamed:@"volume3.png"] forState:UIControlStateNormal];
    }

    }

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

3 голосов
/ 19 июля 2010

Если вы обойдете иерархию представлений MPVolumeView и обнаружите UISlider, вы всегда можете настроить его.

for ( view in theVolumeView.subviews ) {
  if ( [view isKindOfClass:[UISlider class]] ) { ... }
}

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

2 голосов
/ 19 июля 2010

Хм, вы можете сделать свой собственный слайдер, но он не будет контролировать громкость нужного вам игрока.Вам придется работать с низкоуровневыми фреймворками, такими как CoreAudio и CoreMedia.

Почему бы не создать подкласс MPVolumeView?Я никогда не пробовал создавать подклассы MPVolumeView, но вы можете получить доступ к @protected материалу, используя подклассы и @private, добавив некоторые категории.Возможно, вы захотите взглянуть на заголовки MPVolumeView, чтобы увидеть, есть ли UISlider (или что-то), который вы можете настроить.

ОБНОВЛЕНИЕ: (2010/07/21)

Я вижу.Просто позволь мне спросить тебя кое о чем.Почему необходимо добавить UIProgressView в VolumeView?В общем, вы бы добавили это в Player Player, но к его громкости, верно?громкость не загружается как потоковое аудио или видео, верно?

Во-вторых, я только что увидел заголовки MPVolumeView.И у него есть закрытый, также скрытый класс с именем MPVolumeViewInternal * _internal;Если у вас есть такие классы, если их очень трудно настроить без отклонения (при отправке приложения в AppStore), вы можете создать категорию и получить доступ к _internal var, но для использования _internal у вас должны быть заголовки, и это означает, чтоиспользуя закрытые заголовки и структуры, которые не разрешены.

Или вы можете взглянуть на функции в Справочник по Objective-C Runtime и попробовать что-то вроде drawonward, предложенное для поиска UISlider объекта, который выхочу изменить.Использование функций времени выполнения Obj-C - это то, как выполняется большинство трюков или простой хак;)

1 голос
/ 22 декабря 2011

Создание UIView в Интерфейсном конструкторе Ссылка против структуры MP Включите заголовок MediaPlayer в файл заголовка, который соответствует XIB, который содержит UIView, который вы только что сделали Измените класс только что созданного представления на MPVolumeView

Он не будет работать на симуляторе, но он работает на устройствах.

0 голосов
/ 11 апреля 2013

вот полный код пользовательского слайдера громкости.он протестирован и работает на xcode 4.6.1

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:volumeSlider.bounds] autorelease];


    UIView *a=[[UIView alloc] init];
    for (UIView *view in [volumeView subviews]) {
        if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
            a=view;
            [(UISlider *)a setThumbImage:[UIImage imageNamed:@"slider_thumb.png"] forState:UIControlStateNormal];
            [(UISlider *)a setMinimumTrackImage:[UIImage imageNamed:@"slider_progress.png"]  forState:UIControlStateNormal];
            [(UISlider *)a setMaximumTrackImage:[UIImage imageNamed:@"slider_bg.png"] forState:UIControlStateNormal];
        }

    }

    [volumeSlider addSubview:volumeView];
    [volumeView sizeToFit];

Вы можете объявить имена изображений в верхней части или в заголовочном файле для облегчения последующих изменений

0 голосов
/ 18 октября 2012

Другой вариант будет использовать пользовательский слайдер с MPMusicPlayerController:

MPMusicPlayerController *controller = [MPMusicPlayerController applicationMusicPlayer];
controller.volume = 0.5; // value in [0,1]
...