web-dev-qa-db-ja.com

iOS 7:MPMusicPlayerControllerボリュームは廃止されました。今すぐデバイスの音量を変更するには?

MPMusicPlayerController setVolumeは iOS 7から非推奨

システム音楽の音量を変更する他の方法はありますか?できればユーザーの操作なし。その重要な機能:AppStoreからの目覚まし時計の音量を自動的に上げる。

41

あなたの質問に正確に答えるには:はい、ユーザーの操作なしでシステムの音量を変更する他の方法があります。

最近まで、プログラムでMPVolumeViewを使用してボリュームを変更することはprivate APIを使用した場合にのみ可能であると考えていました。しかし、volumeSliderの値を変更し、スライダーのtouchUPイベントを偽装することを確認しました。

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

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

[volumeViewSlider setValue:1.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

(スライダーがtouchUPイベントを受け取ると、_commitVolumeChangeメソッド自体、システムボリュームを変更します)

51
ambientlight

Appleがこの決定を取り消すのにふさわしいと思うまで、私が発見した2つの救済策があります。

  • ボリュームプロパティを使用し続ける、それはまだiOS 7.0.2で動作しています
  • AVAudioSession.outputVolumeを使用して、アプリが起動したときにボリュームを読み取り、ユーザーが指定した値よりも小さい(または大きい)場合は、MPVolumeViewを含むアラートをポップアップします。少なくともユーザーは、アラーム(または何でも)が静かに再生され、音量を調整する機会があることを知っています。または、音量レベルを非常に明確に表示するだけで、驚くことはありません。
13
amergin

これを行うだけです:

let masterVolumeSlider: MPVolumeView = MPVolumeView()

if let view = masterVolumeSlider.subviews.first as? UISlider{

    view.value = 1.0

}
9
Jon Vogel

@Hurden、私はSwift MPVolumeSliderを実装するコードを書きました:

for view in mpVolumeView.subviews {
  let uiview: UIView = view as UIView
  //println("\(uiview.description)")
  if uiview.description.rangesOfString("MPVolumeSlider").first != nil {
    mpVolumeSilder = (uiview as UISlider)
    currentDeviceVolume = mpVolumeSilder!.value
    return
  }
}

Func rangeOfString拡張文字列はここにあります Swift:純粋なSwift Stringインスタンスの範囲を返すメソッド(Xcode 6 Beta 5)

このコードを使用して、ジェスチャーとmpvolumesliderを連携させます

@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
  let translation = recognizer.translationInView(self.view)
  let dx = (translation.x-lastTranslationX)
  let volumeChanged = Float(dx / mpVolumeView.frame.width)
  currentDeviceVolume = currentDeviceVolume + Float(volumeChanged)

  if currentDeviceVolume > 1 {
    currentDeviceVolume = 1
  } else if currentDeviceVolume < 0 {
    currentDeviceVolume = 0
  }

  mpVolumeSilder!.value = currentDeviceVolume

  if recognizer.state == .Changed {
    lastTranslationX = translation.x
  }
  if recognizer.state == .Ended || recognizer.state == .Began {
    lastTranslationX = 0
  }
}
4
charles.cc.hsu

迅速なバージョン:

// Outlet added in Storyboard (Add UIView then set class to MPVolumeView)
@IBOutlet weak var mpVolumeView: MPVolumeView!

    // Get volume slider within MPVolumeView
    for subview in self.mpVolumeView.subviews {
        if (subview as UIView).description.rangeOfString("MPVolumeSlider") != nil {
            // Set volume
            let volumeSlider = subview as UISlider
            volumeSlider.value = 1

            // Works with or without the following line:
            // volumeSlider.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
            break
        }
    }
1
Oak

どうやらisシステムのボリュームを変更する方法何も表示せずに

そして何よりも、それはiOS 11で動作します。

ここに私がそれを達成した方法があります:

1)目的のViewControllerに2つの変数を作成します

let volumeView = MPVolumeView()
var slider: UISlider?

2)以下のコードをviewDidLoadに追加します

volumeView.alpha = 0.01
self.view.addSubview(volumeView)

if let view = volumeView.subviews.first as? UISlider {
    slider = view
}

3)必要に応じてボリュームを変更する

slider?.value = 0.4
1
Markus
let masterVolumeSlider  : MPVolumeView = MPVolumeView()

        if let view             = masterVolumeSlider.subviews.first as? UISlider{

        view.value              = fVolume!

        view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)

        }
0
Vicky

このソリューションは少し緊張し、公式APIが存在しないのは少し奇妙だと思いますが、ここに私のSwift ambientlightの投稿から構築されたソリューションがあります

var _volumeView = MPVolumeView()
var _volumeSlider : UISlider? = nil



self.view.addSubview(_volumeView)
_volumeView.hidden = true

var i = 0
while i < _volumeView.subviews.count {
   if let _r = _volumeView.subviews[i] as? UISlider {
      _volumeSlider = _r
      break
   }
   ++i
}
0
Krtko