MPMusicPlayerController的setVolume方法自iOS 7起已被弃用
还有其他方式可以改变系统音乐音量吗?最好不需要用户交互。 其中一个重要功能:自动增加AppStore中任何闹钟的音量。
MPMusicPlayerController的setVolume方法自iOS 7起已被弃用
还有其他方式可以改变系统音乐音量吗?最好不需要用户交互。 其中一个重要功能:自动增加AppStore中任何闹钟的音量。
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
方法,该方法将更改系统音量。
在苹果决定取消此项功能之前,我已经发现有两种解决方法:
只需要这样做:
let masterVolumeSlider: MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = 1.0
}
masterVolumeSlider.alpha = 0.01; self.view.addSubview(masterVolumeSlider)
这样做使我能够降低音量而不显示操作系统的音量计。 - Rich Fox@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 扩展 String Swift:返回 String 实例范围的纯 Swift 方法(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中创建两个变量
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
Swift版本:
// 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
}
}
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
}