以前は、このアプローチを使用してプログラムで音量を設定していました。
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ビューに追加することで解決しました。それ以外の場合、ボリュームは設定されませんでした。これをコントローラーに追加したときに、ボリュームビューの位置を画面の外側に設定して、ユーザーから見えないようにする必要もあります。
特にボリュームを設定した直後にサウンドを再生する必要がある場合は、遅延ボリュームの設定を使用しない方が複雑になります。
コードは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)
}
IOS 12でhudが表示されないようにするには、階層内のビューのサブビューとしてMPVolumeViewを用意する必要がありました。
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
}