如何在iOS 11.4上以编程方式更改卷

时间:2018-06-07 09:38:48

标签: ios objective-c mpvolumeview

之前,我使用这种方法以编程方式设置音量:

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 :(得分:11)

在一小段延迟后更改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 version

答案 1 :(得分:2)

我通过向我的UIViewController视图添加新的MPVolumeView解决了它,否则它不再设置音量。当我将它添加到控制器时,我还需要将音量视图位置设置在屏幕之外以将其隐藏在用户之外。

我不想使用延迟音量设置,因为它会使事情变得更复杂,特别是如果您需要在设置音量后立即播放声音。

代码在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)
}

答案 2 :(得分:1)

我刚刚将MPVolumeView作为子视图添加到另一个视图(从未在屏幕上绘制过)。

必须在尝试设置或获取音量之前完成此操作。

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

func prepareWorkaround() {
    self.containerView.addSubview(self.volumeView)
}

答案 3 :(得分:0)

我必须具有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
}