Как программно изменить громкость на iOS 11.4 - PullRequest
0 голосов
/ 07 июня 2018

Раньше я программно настраивал громкость звука, используя такой подход:

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];

До iOS 11.4 он работал хорошо (даже на iOS 11.3), а на iOS 11.4 - нет.Значение объема остается неизменным.Может кто-нибудь помочь с этим вопросом?Спасибо.

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019

Мне нужно было MPVolumeView в качестве подпредставления для представления в иерархии, чтобы HUD не отображался на iOS 12. Он должен быть слегка видимым:

let volume = MPVolumeView(frame: .zero)
volume.setVolumeThumbImage(UIImage(), for: UIControl.State())
volume.isUserInteractionEnabled = false
volumelume.alpha = 0.0001
volume.showsRouteButton = false
view.addSubview(volume)

При настройке громкости я получаюползунок из MPVolumeView, как и в предыдущих плакатах и ​​установите значение:

func setVolumeLevel(_ volumeLevel: Float) {
    guard let slider = volume.subviews.compactMap({ $0 as? UISlider }).first else {
        return
    }

    slider.value = volumeLevel
}
0 голосов
/ 09 июня 2018

Я решил это, добавив новый MPVolumeView к моему представлению UIViewController, иначе он больше не устанавливал громкость.Когда я добавил его в контроллер, мне также необходимо установить положение просмотра громкости за пределами экрана, чтобы скрыть его от пользователя.

Я предпочитаю не использовать задержку настройки громкости, поскольку это усложняет задачу, особенно если вам необходимо воспроизвести звук сразу после настройки громкости.

Код указан в 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 setVolume(_ volume: Float) {
    let lst = volumeControl.subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}
    let slider = lst.first as? UISlider

    slider?.setValue(volume, animated: false)
}
0 голосов
/ 15 июля 2018

Я просто добавил MPVolumeView в качестве подпредставления к другому виду (который никогда не отображался на экране).

Это нужно было сделать до любой попытки установить или получить громкость.

private let containerView = UIView()
private let volumeView = MPVolumeView()

func prepareWorkaround() {
    self.containerView.addSubview(self.volumeView)
}
0 голосов
/ 07 июня 2018

Изменение volumeViewSlider.value после небольшой задержки решает проблему.

- (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 версия

...