2010-09-28 5 views
19

J'ai essayé plusieurs méthodes pour implémenter un UISlider régulier et contrôler le volume du périphérique, mais toutes les fonctions Native-C entraînent de nombreux bogues introuvables.Comment personnaliser MPVolumeView?

J'ai essayé le MPVolumeView cela fonctionne comme le charme, il contrôle même le volume de l'appareil même après la fermeture de l'application, tout comme l'application iPod.

Ma question est, est-il de toute façon de personnaliser le MPVolumeView avec des couleurs et des images spécifiques, tout comme UISlider?

REMARQUE: je souhaite une méthode légale sans utiliser d'API non documentées privées.

MISE À JOUR
Comme par réponse @Alexsander Akers, car les vues sont cachées dans les sous MPVolumeView je dû faire défiler subviews, obtenir le UISlider et le personnaliser, est le code ici.

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 fait. Beau travail de mise à jour de votre question. –

+5

Juste par curiosité, était-ce accepté dans l'App Store? – sooper

+0

@sooper réponse très tardive, désolé. Malheureusement, je n'ai pas continué cette application et je ne l'ai jamais soumise à App Store.Mais d'expérience personnelle, j'ai vu de nombreux tutoriels de modification des composants originaux et ils ont été acceptés. – medopal

Répondre

10

Vous pouvez essayer le vélo à travers ses sous-vues et recherchez une sous-classe UISlider?

+1

En fin de compte c'est exactement ce que j'ai utilisé, Juste pour plus de clarté, je vais mettre à jour la question avec le code. J'espère que Apple ne rejette pas l'application pour cela. – medopal

7

Depuis iOS 5.0 vous pouvez utiliser UIAppearance sur un UISlider, même si une partie de MPVolumeView.

Partout dans votre base de code:

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

Voici une liste de quelques-unes des autres classes qui peuvent être mises en œuvre à l'aide UIAppearance: https://gist.github.com/mattt/5135521

+0

Ne fonctionne pas sur iOS 7 –

+0

Fonctionne parfaitement sur iOS 8! – Genevios

3

Il existe maintenant des moyens pour ce faire, il suffit d'utiliser:

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

Quels sont les noms de méthodes légèrement différents de ceux de la vanille UISlider. Cela vous évite d'avoir à faire défiler les vues et potentiellement avoir quelque chose de brisé à l'avenir car Apple change les choses.

0

Réponse à 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 
      } 
     } 
    } 

Résultat:

enter image description here