2010-09-28 13 views
19

Próbowałem wielu metod, aby zaimplementować zwykły UISlider i kontrolować głośność urządzenia, ale wszystkie funkcje Native-C powodują wiele błędów niemożliwych do wykrycia.Jak dostosować MPVolumeView?

Próbowałem MPVolumeView działa jak charm, a nawet kontroluje głośność urządzenia nawet po zamknięciu aplikacji, podobnie jak w przypadku aplikacji na iPoda.

Moje pytanie brzmi, czy jest tak, aby dostosować MPVolumeView do określonych kolorów i obrazów, podobnie jak UISlider?

UWAGA: Chcę korzystać z metody prawnej bez korzystania z prywatnych nieudokumentowanych interfejsów API.

UPDATE
Zgodnie @Alexsander Akers odpowiedź, ponieważ sub poglądy są ukryte w MPVolumeView musiałem przechodzić subviews, uzyskać UISlider i dostosować ją, oto kod.

IBOutlet UISlider *volumeSlider; //defined in <class.h> and connected to a UISlider in Interface Builder 

-(void) viewDidLoad { 
    .... 
    [self setCustomSlider]; 
    .... 
} 

-(void) setCustomSlider{ 
    MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:[volumeSlider frame]] autorelease]; 
    NSArray *tempArray = volumeView.subviews; 

    for (id current in tempArray){ 
      if ([current isKindOfClass:[UISlider class]]){ 
        UISlider *tempSlider = (UISlider *) current; 
        UIImage *img = [UIImage imageNamed:@"trackImage.png"]; 
        img = [img stretchableImageWithLeftCapWidth:5.0 topCapHeight:0]; 
        [tempSlider setMinimumTrackImage:img forState:UIControlStateNormal]; 

        [tempSlider setThumbImage:[UIImage imageNamed:@"thumbImage.png"] forState:UIControlStateNormal]; 

      } 
    } 
    [volumeSlider removeFromSuperview]; 
    [self.view addSubview:volumeView]; 
} 
+0

dobrze zrobione. Dobra robota aktualizująca twoje pytanie. –

+5

Po prostu z ciekawości, czy zostało to zaakceptowane w App Store? – sooper

+0

@sooper bardzo późno, przepraszam. Niestety, nie kontynuowałem tej aplikacji i nigdy nie przesłałem jej do App Store.Ale z własnego doświadczenia widziałem wiele samouczków modyfikujących oryginalne komponenty i zostały one zaakceptowane. – medopal

Odpowiedz

10

Możesz spróbować jazdy na rowerze poprzez jej subviews i poszukać podklasy UISlider?

+1

W końcu to dokładnie to, czego użyłem, dla jasności zaktualizuję pytanie za pomocą kodu. Mam nadzieję, że Apple nie odrzuci tej aplikacji. – medopal

7

Od iOS 5.0 można użyć UIAppearance na UISlider, nawet gdy część MPVolumeView.

gdziekolwiek w kodzie:

[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_full.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal]; 
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_empty.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal]; 
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setThumbImage:[UIImage imageNamed:@"nowplaying_player_nob.png"] forState:UIControlStateNormal]; 

Oto lista niektórych innych klas, które mogą być realizowane z wykorzystaniem UIAppearance: https://gist.github.com/mattt/5135521

+0

Nie działa w systemie iOS 7 –

+0

Działa doskonale na iOS 8! – Genevios

3

Istnieją obecnie sposoby, aby tego dokonać, wystarczy użyć:

– setMaximumVolumeSliderImage:forState: 
– setMinimumVolumeSliderImage:forState: 
– setVolumeThumbImage:forState: 

Które są nieco inne nazwy metod niż te dla wanilii UISlider.

Zapobiega to konieczności przechodzenia między widokami i potencjalnie może mieć coś w przyszłości, ponieważ Apple zmienia rzeczy.

0

odpowiedzi w Swift:

func customSlider() { 
     let temp = mpVolView.subviews 
     for current in temp { 
      if current.isKind(of: UISlider.self) { 
       let tempSlider = current as! UISlider 
       tempSlider.minimumTrackTintColor = .yellow 
       tempSlider.maximumTrackTintColor = .blue 
      } 
     } 
    } 

Wynik:

enter image description here