web-dev-qa-db-fra.com

iOS 7: le volume MPMusicPlayerController est obsolète. Comment changer le volume de l'appareil maintenant?

MPMusicPlayerController setVolume est obsolète depuis iOS 7

Existe-t-il un autre moyen de modifier le volume de la musique système? De préférence sans interaction de l'utilisateur .. Sa principale caractéristique est d'augmenter le volume automatiquement pour tout réveil de l'AppStore.

40
Maxim Kholyavkin

Pour répondre exactement à votre question: Oui, il existe un autre moyen de modifier le volume du système sans interaction de l'utilisateur.

Jusqu'à récemment, je pensais qu'il était possible de modifier le volume à l'aide de MPVolumeView par programmation uniquement à l'aide de private API . Mais je viens de vérifier que la modification de la valeur de volumeSlider et de l'événement touchUP du curseur simulé fonctionnent:

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

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

[volumeViewSlider setValue:1.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

(Lorsque le curseur reçoit un événement touchUP, il invoquera la méthode _commitVolumeChange sur lui-même, ce qui modifiera le volume du système.)

51
ambientlight

Jusqu'à ce qu'Apple juge opportun d'annuler cette décision, j'ai découvert deux solutions:

  • Continuez à utiliser la propriété volume, elle fonctionne toujours sous iOS 7.0.2
  • Utilisez AVAudioSession.outputVolume pour lire le volume lorsque votre application se réveille et affiche une alerte contenant un MPVolumeView si le volume est inférieur (ou supérieur) à une valeur spécifiée par l'utilisateur. Au moins, votre utilisateur sait que son alarme (ou autre chose) va sonner doucement et a la possibilité de régler le volume. Alternativement, vous pouvez simplement afficher très clairement le niveau de volume pour éviter les surprises.
13
amergin

Faites juste ceci:

let masterVolumeSlider: MPVolumeView = MPVolumeView()

if let view = masterVolumeSlider.subviews.first as? UISlider{

    view.value = 1.0

}
9
Jon Vogel

@Hurden, j'ai écrit un code Swift pour implémenter MPVolumeSlider:

for view in mpVolumeView.subviews {
  let uiview: UIView = view as UIView
  //println("\(uiview.description)")
  if uiview.description.rangesOfString("MPVolumeSlider").first != nil {
    mpVolumeSilder = (uiview as UISlider)
    currentDeviceVolume = mpVolumeSilder!.value
    return
  }
}

L'extension String func rangeOfString est disponible ici Swift: une méthode purement Swift pour renvoyer des plages d'une instance String (Xcode 6 Beta 5)

Et utilisez ce code pour que le geste et mpvolumeslider fonctionnent ensemble

@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
  let translation = recognizer.translationInView(self.view)
  let dx = (translation.x-lastTranslationX)
  let volumeChanged = Float(dx / mpVolumeView.frame.width)
  currentDeviceVolume = currentDeviceVolume + Float(volumeChanged)

  if currentDeviceVolume > 1 {
    currentDeviceVolume = 1
  } else if currentDeviceVolume < 0 {
    currentDeviceVolume = 0
  }

  mpVolumeSilder!.value = currentDeviceVolume

  if recognizer.state == .Changed {
    lastTranslationX = translation.x
  }
  if recognizer.state == .Ended || recognizer.state == .Began {
    lastTranslationX = 0
  }
}
4
charles.cc.hsu

Version rapide:

// Outlet added in Storyboard (Add UIView then set class to MPVolumeView)
@IBOutlet weak var mpVolumeView: MPVolumeView!

    // Get volume slider within MPVolumeView
    for subview in self.mpVolumeView.subviews {
        if (subview as UIView).description.rangeOfString("MPVolumeSlider") != nil {
            // Set volume
            let volumeSlider = subview as UISlider
            volumeSlider.value = 1

            // Works with or without the following line:
            // volumeSlider.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
            break
        }
    }
1
Oak

Apparemment, il y a est un moyen de changer le volume du système sans rien afficher .

Et le meilleur de tout cela fonctionne sur iOS 11 .

Voici comment je l'ai réalisé: 

1) Créez deux variables dans le ViewController souhaité 

let volumeView = MPVolumeView()
var slider: UISlider?

2) Ajoutez le code ci-dessous dans votre viewDidLoad

volumeView.alpha = 0.01
self.view.addSubview(volumeView)

if let view = volumeView.subviews.first as? UISlider {
    slider = view
}

3) Changez de volue quand vous en avez besoin

slider?.value = 0.4
1
Markus
let masterVolumeSlider  : MPVolumeView = MPVolumeView()

        if let view             = masterVolumeSlider.subviews.first as? UISlider{

        view.value              = fVolume!

        view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)

        }
0
Vicky

Cette solution rend un peu nerveuse et je pense que c'est un peu étrange qu'une API officielle n'existe pas, mais voici ma solution Swift basée sur le message de ambientlight

var _volumeView = MPVolumeView()
var _volumeSlider : UISlider? = nil



self.view.addSubview(_volumeView)
_volumeView.hidden = true

var i = 0
while i < _volumeView.subviews.count {
   if let _r = _volumeView.subviews[i] as? UISlider {
      _volumeSlider = _r
      break
   }
   ++i
}
0
Krtko