从iOS 7开始不推荐使用MPMusicPlayerController setVolume
还有其他改变系统音乐音量的方法吗?最好没有用户交互。它的重要功能:从AppStore自动为任何闹钟增加音量。
确切地回答您的问题:是的,还有其他方法可以在无需用户交互的情况下更改系统容量。
直到最近,我一直认为只有通过专用API才能以编程方式使用MPVolumeView更改音量。但我刚刚证实,更改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
自行调用方法,这将改变系统音量)
在苹果公司认为可以撤销这一决定之前,我发现了两种补救措施:
- 继续使用volume属性,它在iOS 7.0.2下仍然可以使用
- 当应用唤醒时,使用AVAudioSession.outputVolume读取音量,如果音量小于(或大于)用户指定的值,则弹出包含MPVolumeView的警报。至少您的用户知道他们的闹钟(或其他声音)会安静地播放,并有机会调节音量。或者,您可以非常清楚地显示音量,因此不会感到惊讶。
只是这样做:
let masterVolumeSlider: MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = 1.0
}
@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:用于返回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
}
}
迅捷版:
// 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
}
}
显然有是一种方法来改变系统的音量,而完全不显示任何内容。
最棒的是,它可以在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
这个解决方案有点紧张,我认为不存在正式的API有点奇怪,但这是我的Swift解决方案是基于Environmentallight的帖子构建的
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
}
let masterVolumeSlider : MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = fVolume!
view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
}
本文地址:http://ios.askforanswer.com/ios-7bujianyishiyongmpmusicplayercontrollerjuanxianzairuhegenggaishebeiyinliang.html
文章标签:ios , ios7 , mpmusicplayercontroller , volume
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
文章标签:ios , ios7 , mpmusicplayercontroller , volume
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!