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

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

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上却没有。 体积值保持不变。 有人可以帮忙解决这个问题吗? 谢谢。

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

我通过向我的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) } 

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

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

 private let containerView = UIView() private let volumeView = MPVolumeView() func prepareWorkaround() { self.containerView.addSubview(self.volumeView) }