MPMusicPlayerController setVolume はiOS 7 以降非推奨です
システムの音楽の音量を変更する他の方法はありますか? できればユーザーの操作なしで。その重要な機能: AppStore の目覚まし時計の音量を自動的に上げます。
MPMusicPlayerController setVolume はiOS 7 以降非推奨です
システムの音楽の音量を変更する他の方法はありますか? できればユーザーの操作なしで。その重要な機能: AppStore の目覚まし時計の音量を自動的に上げます。
質問に正確に答えるには: はい、ユーザーの操作なしでシステムの音量を変更する方法は他にもあります。
最近まで、プログラムで 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
それ自体でメソッドが呼び出され、システムの音量が変更されます)
Apple がこの決定を撤回するのにふさわしいと判断するまで、私が発見した 2 つの解決策があります。
これを行うだけです:
let masterVolumeSlider: MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = 1.0
}
@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
}
}
どうやら、何も表示せずにシステム ボリュームを変更する方法があるようです。
そして何よりも、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
let masterVolumeSlider : MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = fVolume!
view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
}
このソリューションは少し神経質になります。公式の 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
}