To answer brush51’s question:
How can i do that? just change the DEVICE volume?
As 0x7fffffff suggested:
You cannot change device volume programatically, however MPVolumeView (volume slider) is there to change device volume but only through user interaction.
So, Apple recommends using MPVolumeView
, so I came up with this:
Add volumeSlider
property:
@property (nonatomic, strong) UISlider *volumeSlider;
Init MPVolumeView
and add somewhere to your view (can be hidden, without frame, or empty because of showsRouteButton = NO
and showsVolumeSlider = NO
):
MPVolumeView *volumeView = [MPVolumeView new];
volumeView.showsRouteButton = NO;
volumeView.showsVolumeSlider = NO;
[self.view addSubview:volumeView];
Find and save reference to 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;
}
}];
Add target action for UIControlEventValueChanged
:
[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];
And then detect volume changing (i.e. by the hardware volume controls):
- (void)handleVolumeChanged:(id)sender
{
NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value);
}
and also other way around, you can set volume by:
self.volumeSlider.value = < some value between 0.0f and 1.0f >;
Hope this helps (and that Apple doesn’t remove MPVolumeSlider from MPVolumeView).