42

MPMusicPlayerController setVolume はiOS 7 以降非推奨です

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

4

8 に答える 8

51

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

最近まで、プログラムで MPVolumeView を使用してボリュームを変更するには、プライベート 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それ自体でメソッドが呼び出され、システムの音量が変更されます)

于 2014-07-28T10:15:07.080 に答える
13

Apple がこの決定を撤回するのにふさわしいと判断するまで、私が発見した 2 つの解決策があります。

  • volume プロパティを使い続けてください。iOS 7.0.2 でも動作します。
  • アプリの起動時に AVAudioSession.outputVolume を使用して音量を読み取り、音量がユーザー指定の値より低い (または高い) 場合は、MPVolumeView を含むアラートをポップアップします。少なくとも、ユーザーは、アラーム (または何でも) が静かに再生され、音量を調整する機会があることを知っています。または、音量レベルを非常に明確に表示して、驚かないようにすることもできます。
于 2013-10-23T07:26:19.530 に答える
10

これを行うだけです:

let masterVolumeSlider: MPVolumeView = MPVolumeView()

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

    view.value = 1.0

}
于 2015-07-02T22:02:52.083 に答える
4

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

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: A pure Swift method for return ranges of a String instance (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
  }
}
于 2015-02-15T01:14:32.830 に答える
1

どうやら、何も表示せずにシステム ボリュームを変更する方法あるようです。

そして何よりも、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
于 2017-08-22T17:49:00.587 に答える
0
let masterVolumeSlider  : MPVolumeView = MPVolumeView()

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

        view.value              = fVolume!

        view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)

        }
于 2016-01-20T08:23:40.730 に答える
0

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

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
}
于 2015-09-17T01:48:58.223 に答える