2015-10-16 10 views
6

devo cambiare il volume su iPad e utilizzando questo codice:iOS 9: come modificare il volume a livello di codice senza mostrare la barra dei suoni del sistema?

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; 

Ma questo volume mutevole e che mostra la barra del volume di sistema su iPad. Come modificare l'audio senza mostrare la barra del volume?

Lo so, setVolume: è deprecato e tutti dicono di usare MPVolumeView. Se questo è l'unico modo per risolvere il mio problema, allora come cambiare il volume usando MPVolumeView? Non vedo alcun metodo in MPVolumeView che modifica l'audio.
Devo usare qualche altra classe insieme a MPVolumeView?

Ma è preferibile utilizzare MPMusicPlayerController.

Grazie in consiglio!

+1

Non si dovrebbe modificare il volume a livello di codice, questo è il punto intero di "setVolume:" deprecato. La tua app potrebbe essere respinta. –

risposta

10

MPVolumeView ha un cursore, e cambiando il valore del cursore, è possibile modificare il volume del dispositivo. Ho scritto un MPVolumeView un'estensione di accedere facilmente il dispositivo di scorrimento:

extension MPVolumeView { 
    var volumeSlider:UISlider { 
     self.showsRouteButton = false 
     self.showsVolumeSlider = false 
     self.hidden = true 
     var slider = UISlider() 
     for subview in self.subviews { 
      if subview.isKindOfClass(UISlider){ 
       slider = subview as! UISlider 
       slider.continuous = false 
       (subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume 
       return slider 
      } 
     } 
     return slider 
    } 
} 
+0

Ha funzionato? Sto cercando di usarlo senza molto successo! Ho aggiunto una vista e la ho sottoclassata a MPVolumeView ma non sembra funzionare. – Gugulethu

+0

Lavora per me! Grazie! – Jerome

+1

questo era super utile – Fluidity

3

Non penso che ci sia un modo per cambiare il volume senza il controllo del volume lampeggiante. Si dovrebbe usare MPVolumeView come questo:

MPVolumeView* volumeView = [[MPVolumeView alloc] init]; 

// Get the Volume Slider 
UISlider* volumeViewSlider = nil; 

for (UIView *view in [volumeView subviews]){ 
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]){ 
     volumeViewSlider = (UISlider*)view; 
     break; 
    } 
} 

// Fake the volume setting 
[volumeViewSlider setValue:1.0f animated:YES]; 
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

Funziona per me su iOS8 ma NON funziona su iOS9. Esiste una soluzione alternativa per iOS9? – frakman1

1

Swift> 2.2, iOS> 8.0,

non ho trovato alcuna soluzione che stavo cercando, ma io alla fine a fare questo come soluzione:

let volumeView = MPVolumeView() 

override func viewDidLoad() { 
    ... 
    view.addSubview(volumeView) 
    volumeView.alpha = 0.00001 
} 

func changeSpeakerSliderPanelControls(volume: Float) { 
    for subview in self.volumeView.subviews { 

     if subview.description.rangeOfString("MPVolumeSlider") != nil { 
      let slider = subview as! UISlider 
      slider.value = volume 

      break 
     } 
    } 
} 
1

Ecco una soluzione in Swift. Potrebbe essere un problema, quindi ti farò sapere se Apple l'ha approvato quando pubblico. Nel frattempo, questo funziona bene per me:

  1. Definire un MPVolumeView e un UISlider facoltativa nella tua View Controller

    private let volumeView: MPVolumeView = MPVolumeView() 
    private var volumeSlider: UISlider? 
    
  2. Nel storyboard, definire una vista che è nascosto da parte dell'utente (height = 0 dovrebbe fare il trucco), e impostare uno sbocco per questo (lo chiameremo hiddenView qui). Questo passo è buono solo se si desidera non visualizzare il volume HUD quando si cambia il volume (vedi nota sotto):

    @IBOutlet weak var hiddenView: UIView! 
    
  3. In viewDidLoad() o da qualche parte init-y che viene eseguito una volta, prendere l'UISlider che in realtà controlla il volume nella UISlider facoltativa dal punto (1):?

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        ... 
    
        hiddenView.addSubview(volumeView) 
        for view in volumeView.subviews { 
         if let vs = view as? UISlider { 
          volumeSlider = vs 
          break 
         } 
        } 
    } 
    
  4. Quando si desidera impostare il volume nel codice, basta impostare volumeSlider .value per essere ovunque tra 0.0 e 1.0, ad esempio,per aumentare il volume:

    func someFunc() { 
        if volumeSlider?.value < 0.99 { 
         volumeSlider?.value += 0.01 
        } else { 
         volumeSlider?.value = 1.0 
        } 
    } 
    

Nota importante: Questa soluzione sarà prevenire Volume HUD di iPhone di apparire - sia quando si cambia il volume nel codice, o quando l'utente fa clic pulsanti del volume esterno. Se si desidera visualizzare l'HUD, saltare tutte le immagini nascoste e non aggiungere affatto MPVolumeView come sottoview. Ciò farà sì che iOS visualizzi l'HUD quando il volume cambia.

2

Versione: Swift 3 & Xcode 8,1

extension MPVolumeView { 
    var volumeSlider:UISlider { // hacking for changing volume by programing 
     var slider = UISlider() 
     for subview in self.subviews { 
      if subview is UISlider { 
       slider = subview as! UISlider 
       slider.isContinuous = false 
       (subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume 
       return slider 
      } 
     } 
     return slider 
    } 
} 
+0

come si dovrebbe usare questo? –

+1

Ciao @JonathanPlackett, puoi provare così: 'self.volumeSlider.value = 1 // ottieni il volume massimo' BTW, auto significa istanza MPVolumeView. Spero in aiuto. – Jerome

2

@udjat 's risposta nella Swift 3

extension MPVolumeView { 
    var volumeSlider: UISlider? { 
     showsRouteButton = false 
     showsVolumeSlider = false 
     isHidden = true 
     for subview in subviews where subview is UISlider { 
      let slider = subview as! UISlider 
      slider.isContinuous = false 
      slider.value = AVAudioSession.sharedInstance().outputVolume 
      return slider 
     } 
     return nil 
    } 
} 
1
extension UIViewController { 
    func setVolumeStealthily(_ volume: Float) { 
    guard let view = viewIfLoaded else { 
     assertionFailure("The view must be loaded to set the volume with no UI") 
     return 
    } 

    let volumeView = MPVolumeView(frame: .zero) 

    guard let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider else { 
     assertionFailure("Unable to find the slider") 
     return 
    } 

    volumeView.clipsToBounds = true 
    view.addSubview(volumeView) 

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak slider, weak volumeView] in 
     slider?.setValue(volume, animated: false) 
     DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak volumeView] in 
     volumeView?.removeFromSuperview() 
     } 
    } 
    } 
} 

Usage:

// set volume to 50% 
viewController.setVolume(0.5) 
Problemi correlati