2010-09-28 16 views
19

He intentado muchos métodos para implementar un UISlider regular y controlar el volumen del dispositivo, pero son todas las funciones de Native-C lo que da como resultado muchos errores que no se pueden rastrear.¿Cómo personalizar MPVolumeView?

Probé el MPVolumeView funciona como el encanto, incluso controla el volumen del dispositivo incluso después de cerrar la aplicación, al igual que la aplicación del iPod.

Mi pregunta es, ¿hay alguna forma de personalizar el MPVolumeView con colores e imágenes específicos, al igual que UISlider?

NOTA: Quiero un método legal sin utilizar API privadas no documentadas.

ACTUALIZACIÓN
Según respuesta @Alexsander Akers, desde los puntos de vista sub están ocultos en MPVolumeView que tuvieron que pasar por subvistas, obtener el UISlider y personalizarlo, aquí está el código.

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

bien hecho. Buen trabajo para actualizar tu pregunta. –

+5

Solo por curiosidad, ¿esto fue aceptado en la App Store? – sooper

+0

@sooper muy tarde respuesta, lo siento. Lamentablemente, no continué esta aplicación y nunca la envié a la App Store.Pero por experiencia personal, he visto muchos tutoriales de modificación de los componentes originales y fueron aceptados. – medopal

Respuesta

10

Usted podría tratar de ciclismo a través de sus subvistas y buscar una subclase UISlider?

+1

Al final eso es exactamente lo que usé, solo por claridad voy a actualizar la pregunta con el código. Espero que Apple no rechace la aplicación por eso. – medopal

7

Desde iOS 5.0 que puede utilizar UIAppearance en un UISlider, aun cuando parte de MPVolumeView.

cualquier lugar de su código base:

[[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]; 

Aquí una lista de algunas de las otras clases que pueden ser implementadas usando UIAppearance: https://gist.github.com/mattt/5135521

+0

No funciona en iOS 7 –

+0

¡Trabajando en iOS 8 perfectamente! – Genevios

3

Ahora hay maneras de lograr esto, basta con utilizar:

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

Cuáles son los nombres de los métodos ligeramente diferentes a los de vanilla UISlider.

Esto le evita tener que pasar por las vistas y potencialmente tener algo que romper en el futuro a medida que Apple cambia las cosas.

0

respuesta en 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 
      } 
     } 
    } 

Resultado:

enter image description here

Cuestiones relacionadas