2013-09-29 20 views
5

Sto progettando un'app Music per iOS 7 e voglio inserire il pulsante di selezione percorso "AirPlay" direttamente nella mia app. Sono in grado di ottenere il pulsante posizionato bene, tuttavia non viene visualizzato perché l'icona è bianca e il mio sfondo è bianco.Cambia colore del pulsante Percorso MPVolumeView iOS 7

C'è un modo per cambiare il colore del pulsante Percorso?

Ecco il codice che sto usando per creare il pulsante.

self.airPlayButton = [[MPVolumeView alloc] initWithFrame:CGRectZero]; 
    self.airPlayButton.showsVolumeSlider = NO; 
    [self.airPlayButton sizeToFit]; 
    self.airPlayButton.backgroundColor = [UIColor myGreenColor]; 
    [self addSubview:self.airPlayButton]; 

Fondamentalmente l'immagine di seguito è ciò che voglio, tranne che voglio l'icona verde anziché solo lo sfondo.

MPVolumeView Route Button with background changed

risposta

5

creare una propria immagine e cercare setRouteButtonImage: forState: Assegna un'immagine pulsante per gli stati di controllo specificati.

- (void)setRouteButtonImage:(UIImage *)image forState:(UIControlState)state 
Parameters 
image 
The image to associate with the specified states. 
state 
The control state with which to associate the image. 
Discussion 
Use this to customize the appearance of the route button when it is enabled, disabled, highlighted, and so on. 

Availability 
Available in iOS 6.0 and later. 
See Also 
– routeButtonImageForState: 
Declared In 
MPVolumeView.h 
+0

Questo ha fatto il trucco! Si è rivelata la soluzione più semplice, grazie per avermi indirizzato alla soluzione giusta! – jrwagz

6

di espandere lanbo's answer, è anche possibile ottenere l'immagine originale del pulsante percorso e creare una copia che utilizza la modalità UIImageRenderingMode.AlwaysTemplate rendering. In questo modo prende in considerazione l'attuale tintColor.

In Swift:

let volumeView = MPVolumeView() 

    if let routeButton = volumeView.subviews.last as? UIButton, 
     let routeButtonTemplateImage = routeButton.currentImage?.imageWithRenderingMode(.AlwaysTemplate) 
    { 
     volumeView.setRouteButtonImage(routeButtonTemplateImage, forState: .Normal) 
    } 
+0

Funziona, ma è sicuro, che l'ultima vista è l'immagine? – Karsten

+0

No, non c'è alcuna garanzia, ma la clausola 'if let' fa in modo che sia sicura se non è un' UIButton'. –

+0

perché è volumeView.routeButtonImageForState (UIControlState.Normal) ?. imageWithRenderingMode (UIImageRenderingMode.AlwaysTemplate); non funziona? –

6

nella revisione Adams risposta mi piace di più chiarezza in questo compito. Così ho salvaguardate quel codice un po ':

Objective-C:

for(UIView *wnd in volumeView.subviews) { 
    if([wnd isKindOfClass:[UIButton class] ]) { 
     UIButton *button = (UIButton*) wnd; 
     UIImage *img = button.currentImage; 
     UIImage *img2 = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
     [volumeView setRouteButtonImage: img2 forState:UIControlStateNormal]; 
     break; 
    } 
} 

Swift:

for view in volumeView.subviews { 
     if view.isKindOfClass(UIButton) { 
      let buttonOnVolumeView : UIButton = view as! UIButton 
      volumeView.setRouteButtonImage(buttonOnVolumeView.currentImage?.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal) 
      break; 
     } 
    } 

Ora reagisce sulla proprietà tintColor di volumeView e se Apple decide di aggiungere un altro pulsante o modificare la sequenza questo codice funzionerà ancora.

+0

Questo ha funzionato perfettamente per me! La migliore soluzione per i miei occhi! Grazie! – funkenstrahlen

Problemi correlati