Je souhaite modifier le volume de l'appareil sur iOS (iphone).
Je sais que je peux modifier le volume de la bibliothèque musicale avec les lignes ci-dessous:
//implement at first MediaPlayer framework
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
musicPlayer.volume = 1;
Mais ce n'est pas mon objectif.
Je souhaite modifier le volume du périphérique ou laissez-moi dire le volume de sonnerie .
Comment puis je faire ça? il suffit de changer lePÉRIPHÉRIQUEvolume?
Pour répondre à la question de brush51:
Comment puis je faire ça? il suffit de changer le volume de l'appareil?
Comme suggéré par 0x7fffffff:
Vous ne pouvez pas modifier le volume du périphérique par programme. Cependant, MPVolumeView (curseur de volume) permet de modifier le volume du périphérique, mais uniquement par le biais d'une interaction de l'utilisateur.
Apple recommande donc d'utiliser MPVolumeView
. C'est pourquoi j'ai proposé ceci:
Ajouter la propriété volumeSlider
:
@property (nonatomic, strong) UISlider *volumeSlider;
Init MPVolumeView
et ajouter quelque part à votre vue (peut être caché, sans cadre, ou vide à cause de showsRouteButton = NO
et showsVolumeSlider = NO
):
MPVolumeView *volumeView = [MPVolumeView new];
volumeView.showsRouteButton = NO;
volumeView.showsVolumeSlider = NO;
[self.view addSubview:volumeView];
Recherchez et enregistrez la référence à UISlider
:
__weak __typeof(self)weakSelf = self;
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[UISlider class]]) {
__strong __typeof(weakSelf)strongSelf = weakSelf;
strongSelf.volumeSlider = obj;
*stop = YES;
}
}];
Ajouter une action cible pour UIControlEventValueChanged
:
[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];
Et puis détectez le changement de volume (c'est-à-dire à l'aide des contrôles de volume matériels):
- (void)handleVolumeChanged:(id)sender
{
NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value);
}
et de toute autre manière, vous pouvez régler le volume en:
self.volumeSlider.value = < some value between 0.0f and 1.0f >;
J'espère que cela vous aidera (et qu'Apple ne supprimera pas MPVolumeSlider de MPVolumeView).
Voici ce que j'ai fait:
func setSystemVolume(volume: Float) {
let volumeView = MPVolumeView()
for view in volumeView.subviews {
if (NSStringFromClass(view.classForCoder) == "MPVolumeSlider") {
let slider = view as! UISlider
slider.setValue(volume, animated: false)
}
}
}
Comme la propriété volume
dans MPMusicPlayerController
était obsolète dans iOS 7. C’est la seule méthode que vous pouvez faire.
Cette solution (Swift) a très bien fonctionné pour moi: http://weimenglee.blogspot.com/2015/07/ios-tip-programmatically-adjust-device.html
import MediaPlayer
let volumeView = MPVolumeView()
if let view = volumeView.subviews.first as? UISlider{
view.value = 0.1 //---0 t0 1.0---
}
Vous devez utiliser applicationMusicPlayer au lieu de iPodMusicPlayer pour définir le volume du système:
#import <MediaPlayer/MediaPlayer.h>
musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
musicPlayer.volume = 1; // max volume
musicPlayer.volume = 0; // min volume (mute)
musicPlayer.volume = 0.0625; // 1 bar on the overlay volume display
Voici une petite classe wrapper qui peut définir le volume du système et également vous informer de tout changement (passez votre propre répondeur de changement à setTarget: action :).
Edit : si vous masquez le contrôle MPVolumeView ou ne l'ajoutez pas en tant que sous-vue, le système affichera le carré du volume par défaut au milieu de l'écran chaque fois que vous modifiez le volume par programme. Si vous n'aimez pas ce que le système fait, la solution consiste à définir les coordonnées de la vue en dehors de l'écran. J'ai édité mon code ci-dessous un peu pour refléter cela.
@import MediaPlayer;
@interface SysVolumeControl : MPVolumeView
@property (nonatomic) float value; // from 0 to 1.0
- (void)setTarget:(id)target action:(SEL)action;
@end
@implementation SysVolumeControl
{
UISlider* _slider;
}
- (id)init
{
if (self = [super initWithFrame:CGRectMake(-300, 0, 200, 50)])
{
for (UIView* view in self.subviews)
{
if ([view isKindOfClass:UISlider.class])
{
_slider = (UISlider*)view;
break;
}
}
}
return self;
}
- (float)value
{ return _slider.value; }
- (void)setValue:(float)value
{ _slider.value = value; }
- (void)setTarget:(id)target action:(SEL)action
{ [_slider addTarget:target action:action forControlEvents:UIControlEventValueChanged]; }
@end
Créez ensuite une instance et utilisez-la:
SysVolumeControl* sysVolumeControl = [SysVolumeControl new];
[myView addSubview:sysVolumeControl];
sysVolumeControl.value = 1.0;
[sysVolumeControl setTarget:self action:@selector(mySysVolumeResponder:)];
Créer à la volée MPVolumeView pour obtenir le curseur et régler le volume ne fonctionne plus dans iOS 11.4 J'ai résolu le problème en ajoutant un nouveau MPVolumeView à ma vue UIViewController, sinon le volume n'était pas défini. Lorsque je l'ai ajouté au contrôleur, je dois également définir la position d'affichage du volume en dehors de l'écran.
Le code est dans Swift 4:
let volumeControl = MPVolumeView(frame: CGRect(x: 0, y: 0, width: 120, height: 120))
override func viewDidLoad() {
self.view.addSubview(volumeControl);
}
override func viewDidLayoutSubviews() {
volumeControl.frame = CGRect(x: -120, y: -120, width: 100, height: 100);
}
func setMaxVolume() {
let lst = volumeControl.subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}
let slider = lst.first as? UISlider
slider?.setValue(1, animated: false)
}
Swift 3 - J'utilise ceci:
func setVolumeTo(volume: Float) {
(MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false)
}