iosobjective-cmpvolumeview

How to change volume programmatically on iOS 11.4


Before, I was setting sound volume programmatically using this approach:

MPVolumeView *volumeView = [[MPVolumeView alloc] init];
UISlider *volumeViewSlider = nil;

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

[volumeViewSlider setValue:0.5 animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

Till iOS 11.4 it was working well (even on iOS 11.3), but on iOS 11.4 it doesn't. Volume value remains unchanged. Can someone help with this issue? Thanks.


Solution

  • Changing volumeViewSlider.value after a small delay resolves problem.

    - (IBAction)increase:(id)sender {
      MPVolumeView *volumeView = [[MPVolumeView alloc] init];
      UISlider *volumeViewSlider = nil;
    
      for (UIView *view in volumeView.subviews) {
        if ([view isKindOfClass:[UISlider class]]) {
          volumeViewSlider = (UISlider *)view;
          break;
        }
      }
    
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        volumeViewSlider.value = 0.5f;
      });
    }
    

    Swift version