Domanda

Come so, MPVolumeView può essere aggiunto alla mia app per modificare il volume. Ma ora voglio controllare il volume con uno slider personalizzato.Forse posso adattarlo da solo se MPVolume fosse una sottoclasse di uislider, anzi, è una sottoclasse di uiview.Chiedete consigli per realizzare la mia idea, grazie mille.

È stato utile?

Soluzione

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

    }
.

che può fare ciò che voglio, ma davvero non so se può passare il controllo di Apple

Altri suggerimenti

Se si cammina la gerarchia di vista di MPVOLUMEVew e capita di trovare un Uisilider, potresti sempre personalizzarlo.

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

Nota che ci saranno altre viste, e potrebbe non esserci un UISLider, quindi non fare assunzioni.Potresti voler attraversare la gerarchia in modo ricorsivo.

Hummm, potresti creare il tuo cursore ma non controllerà il volume del lettore che desideri.Dovrai lavorare con framework di basso livello come CoreAudio e CoreMedia.

Perché non creare una sottoclasse MPVolumeView?Non ho mai provato la sottoclassing MPVolUmeView, ma puoi accedere a @Protected Stuff mediante la sottoclassing e le cose @Private aggiungendo alcune categorie.Probabilmente vorrai guardare le intestazioni di MPVolumeView per vedere se c'è un UISlider (o qualcosa del genere) che puoi personalizzare.

AGGIORNAMENTO:(21/07/2010)

Vedo.Lascia solo che ti chieda una cosa.Perché è necessario aggiungere un UIProgressView a un VolumeView?In generale lo aggiungeresti alla riproduzione del lettore ma al suo volume, giusto?il volume non si carica come lo streaming audio o video, giusto?

In secondo luogo, ho appena visto le intestazioni di MPVolumeView.E ha una classe privata, anch'essa nascosta, denominata MPVolumeViewInternal *_internal;Quando hai questo tipo di classi se molto difficile da personalizzare senza essere rifiutato (quando si invia l'app all'appstore) potresti fare una categoria e accedere a _internal var ma per usare _internal dovrai avere le sue intestazioni e questo significa Utilizzo di intestazioni private e framework che non sono consentiti.

Oppure potresti dare un'occhiata alle funzioni in Riferimento al runtime Objective-C e prova qualcosa come drawonward suggerito per trovare UISlider dell'oggetto che desideri modificare.Usare le funzioni runtime Obj-C è il modo in cui vengono eseguiti la maggior parte dei trucchi o degli hack facili ;)

Fai un'intesione nel costruttore di interfaccia Link contro il quadro MP Includi l'intestazione MediaPlayer nel file di intestazione che corrisponde allo XIB che contiene un'utente che hai appena fatto Cambia la classe della vista che hai appena creato in MPVOLUMEVEW

Non funzionerà sul simulatore, ma funziona sui dispositivi.

Un'altra opzione utilizzerebbe il cursore personalizzato con MPMusicPlayerController:

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

Ecco il codice completo di un cursore del volume personalizzato.È testato e funziona su 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];
.

È possibile dichiarare i nomi delle immagini in alto o in un file di intestazione per facilitare modifiche successive

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top