如何在 iOS 11.4 上以编程方式更改音量
How to change volume programmatically on 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;
});
}
我通过将新的 MPVolumeView 添加到我的 UIViewController 视图来解决它,否则它不再设置音量。当我将它添加到控制器时,我还需要将体积视图位置设置在屏幕之外以对用户隐藏它。
我不喜欢使用延迟音量设置,因为它会使事情变得更复杂,尤其是当您需要在设置音量后立即播放声音时。
代码在Swift4:
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([=10=].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)
}
我必须有一个 MPVolumeView 作为层次结构中视图的子视图,以使 hud 不显示在 iOS12 上。它需要稍微可见:
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({ [=11=] as? UISlider }).first else {
return
}
slider.value = volumeLevel
}
之前,我使用这种方法以编程方式设置音量:
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;
});
}
我通过将新的 MPVolumeView 添加到我的 UIViewController 视图来解决它,否则它不再设置音量。当我将它添加到控制器时,我还需要将体积视图位置设置在屏幕之外以对用户隐藏它。
我不喜欢使用延迟音量设置,因为它会使事情变得更复杂,尤其是当您需要在设置音量后立即播放声音时。
代码在Swift4:
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([=10=].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)
}
我必须有一个 MPVolumeView 作为层次结构中视图的子视图,以使 hud 不显示在 iOS12 上。它需要稍微可见:
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({ [=11=] as? UISlider }).first else {
return
}
slider.value = volumeLevel
}