2010-07-19 3 views
3

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

ответ

4
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]; 
    } 

    } 

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

+1

Так прошло ли это обзор Apple? – Moshe

+2

он прошел обзор, сейчас в appstore! – ben

+1

Вместо сравнения строки описания класса я бы вместо этого использовал '[view isKindOfClass: [UISlider class]]'. Кажется чистым, плюс MPVolumeSlider - подкласс UISlider, и таким образом у вас нет имени частного класса в вашем двоичном файле. – DarkDust

2

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

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

UPDATE: (2010/07/21)

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

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

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

+0

я действительно хочу знать, могу ли я добавить что-то еще в class.i надежды АНИ в so.thank вас – ben

+0

Не могли бы вы уточнить, что вы хотите добавить? – nacho4d

+0

Я хочу вставить UIPпроцесс между большим пальцем и дорожкой UISlider. – ben

3

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

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

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

+0

О, в MPVolumeView нет ни одного члена класса uislider, но есть 3 подвид, я бы хотел посмотреть, что это такое ~~ – ben

+0

вы имеете в виду isKindOfClass :. –

+0

@tc Спасибо, я всегда смешиваю их. – drawnonward

1

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

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

0

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

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

вот полный код ползуну пользовательского тома. он протестирован и работает на 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]; 

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

Смежные вопросы