web-dev-qa-db-ja.com

iOS 9:システムのサウンドバーのポップアップを表示せずにプログラムで音量を変更する方法

IPadでボリュームを変更し、次のコードを使用する必要があります。

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0];

しかし、この変化する音量とiPadのシステム音量バーが表示されます。 音量バーを表示せずにサウンドを変更するには?

知っている、 setVolume:は非推奨であり、誰もがMPVolumeViewを使用するように言っています。これが私の問題を解決する唯一の方法である場合、MPVolumeViewを使用してボリュームを変更する方法は? MPVolumeViewにサウンドを変更するメソッドはありません。
MPVolumeViewと一緒に別のクラスを使用する必要がありますか?

ただし、MPMusicPlayerControllerを使用することをお勧めします。

アドバイスありがとうございます!

17
mgv

MPVolumeViewにはスライダーがあり、スライダーの値を変更することにより、デバイスの音量を変更できます。スライダーに簡単にアクセスするために、MPVolumeView拡張を作成しました。

extension MPVolumeView {
    var volumeSlider:UISlider {
        self.showsRouteButton = false
        self.showsVolumeSlider = false
        self.hidden = true
        var slider = UISlider()
        for subview in self.subviews {
            if subview.isKindOfClass(UISlider){
                slider = subview as! UISlider
                slider.continuous = false
                (subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume
                return slider
            }
        }
        return slider
    }
}
16
udjat

2018年、iOS 11.4での作業

変更する必要があるslider.value少し遅れて。

extension MPVolumeView {
  static func setVolume(_ volume: Float) {
    let volumeView = MPVolumeView()
    let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
      slider?.value = volume
    }
  }
}

使用法:

MPVolumeView.setVolume(0.5)

Objective-Cバージョン

46
trungduc
extension UIViewController {
  func setVolumeStealthily(_ volume: Float) {
    guard let view = viewIfLoaded else {
      assertionFailure("The view must be loaded to set the volume with no UI")
      return
    }

    let volumeView = MPVolumeView(frame: .zero)

    guard let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider else {
      assertionFailure("Unable to find the slider")
      return
    }

    volumeView.clipsToBounds = true
    view.addSubview(volumeView)

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak slider, weak volumeView] in
      slider?.setValue(volume, animated: false)
      DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak volumeView] in
        volumeView?.removeFromSuperview()
      }
    }
  }
}

使用法:

// set volume to 50%
viewController.setVolume(0.5)
5
Senseful

ボリュームコントロールを点滅させずにボリュームを変更する方法はないと思います。次のようにMPVolumeViewを使用する必要があります。

MPVolumeView* volumeView = [[MPVolumeView alloc] init];

// Get the Volume Slider
UISlider* volumeViewSlider = nil;

for (UIView *view in [volumeView subviews]){
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
        volumeViewSlider = (UISlider*)view;
        break;
    }
}

// Fake the volume setting
[volumeViewSlider setValue:1.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
4
Abhinav

@udjatの答えSwift

extension MPVolumeView {
    var volumeSlider: UISlider? {
        showsRouteButton = false
        showsVolumeSlider = false
        isHidden = true
        for subview in subviews where subview is UISlider {
            let slider =  subview as! UISlider
            slider.isContinuous = false
            slider.value = AVAudioSession.sharedInstance().outputVolume
            return slider
        }
        return nil
    }
}
3
BumMo Koo

バージョン:Swift 3&Xcode 8.1

extension MPVolumeView {
    var volumeSlider:UISlider { // hacking for changing volume by programing
        var slider = UISlider()
        for subview in self.subviews {
            if subview is UISlider {
                slider = subview as! UISlider
                slider.isContinuous = false
                (subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume
                return slider
            }
        }
        return slider
    }
}
2
Jerome

これがSwiftのソリューションです。それは日陰のものかもしれないので、Apple私が公開時にこれを承認したかどうかをお知らせします。その間、これは私のためにうまく機能します:

  1. View ControllerでMPVolumeViewとオプションのUISliderを定義します

    private let volumeView: MPVolumeView = MPVolumeView()
    private var volumeSlider: UISlider?
    
  2. ストーリーボードで、ユーザーに対して非表示のビューを定義し(height = 0でトリックを行う必要があります)、そのアウトレットを設定します(ここではhiddenViewと呼びます)。この手順は、ボリュームを変更するときにボリュームHUDを表示しない場合にのみ有効です(以下の注を参照)。

    @IBOutlet weak var hiddenView: UIView!
    
  3. ViewDidLoad()または1回実行されるinit-yで、実際にボリュームを制御するUISliderをステップ(1)からオプションのUISliderにキャッチします。

    override func viewDidLoad() {
        super.viewDidLoad()
    
        ...
    
        hiddenView.addSubview(volumeView)
        for view in volumeView.subviews {
            if let vs = view as? UISlider {
                volumeSlider = vs
                break
            }
        }
    }
    
  4. コードで音量を設定する場合は、volumeSlider?.valueを0.0〜1.0の範囲で設定します。音量を上げるには:

    func someFunc() {
        if volumeSlider?.value < 0.99 {
            volumeSlider?.value += 0.01
        } else {
            volumeSlider?.value = 1.0
        }
    }
    

重要な注意:このソリューションはiPhoneのボリュームHUDが表示されないようにする-コードでボリュームを変更するとき、またはユーザーが外部ボリュームボタンをクリックするときのいずれかです。 HUDを表示する場合は、非表示のビューをすべてスキップし、MPVolumeViewをサブビューとしてまったく追加しないでください。これにより、音量が変化したときにiOSがHUDを表示します。

2
deebugger

Swift> 2.2、iOS> 8.0、

私が探していた解決策は見つかりませんでしたが、解決策としてこれを行うことになります:

let volumeView = MPVolumeView()

override func viewDidLoad() {
    ...
    view.addSubview(volumeView)
    volumeView.alpha = 0.00001
}

func changeSpeakerSliderPanelControls(volume: Float) {
    for subview in self.volumeView.subviews {

        if subview.description.rangeOfString("MPVolumeSlider") != nil {
             let slider = subview as! UISlider
             slider.value = volume

             break
        }
    }
}
1
CodeOverRide

次のコードでデフォルトのUISliderを使用できます。

    import MediaPlayer

    class CusomViewCOntroller: UIViewController

    // could be IBOutlet
    var customSlider = UISlider()

    // in code
    var systemSlider =  UISlider()

    override func viewDidLoad() {
            super.viewDidLoad()

       let volumeView = MPVolumeView()
       if let view = volumeView.subviews.first as? UISlider{
          systemSlider = view
       }
    }

次にコードを書くだけ

systemSlider.value = customSlide.value