我正在使用Xcode 10 +,Swift 4,并定位到iOS 11.4+ 使用MPMediaPlayer
我想以编程方式淡出播放器的音量(就像Apple退出音乐播放器时一样)。 同样,当它运行时,我也不想看到任何东西(例如VolumeView显示)。
似乎所有的程序化音量控件都已弃用。
我已经阅读了很多相关的文章,并创建了这个函数,它存在几个问题:
@objc func fadeVolume(){
var sliderView = UISlider()
//let volumeView = MPVolumeView(frame: CGRect.init(x: self.view.frame.maxX, y: self.view.frame.maxY, width: 0, height: 0))
let volumeView = MPVolumeView(frame: .zero)
volumeView.clipsToBounds = true
volumeView.showsRouteButton = false
//volumeView.isHidden = true
volumeView.alpha = 0.001
for subview in volumeView.subviews {
if let slider = subview as? UISlider {
sliderView = slider
break
}
}
self.view.addSubview(volumeView)
volumeView.didMoveToSuperview()
let current:Float = AVAudioSession.sharedInstance().outputVolume
print("slider value: \(current)")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
UIView.animate(withDuration: 0.4, animations: {
sliderView.setValue(0.0, animated: false)
}, completion: { finished in
// If either one of these is uncommented, the VolumeView will display.
// However, without removing from superview, the VolumeView stays hidden even when I use the phone volume buttons.
volumeView.removeFromSuperview()
//volumeView.alpha = 1.0
})
}
}
第一个问题:VolumeView屏幕显示在屏幕上。我尝试过使用不同的帧,并更改Alpha等。就好像动画永远不会发生,它直接进入完成块一样。
第二个问题:VolumeView实际上确实需要从超级视图中删除,否则即使当我使用电话音量按钮时,VolumeView也将保持隐藏状态。仅应在执行此功能期间将其隐藏。
第三个问题:动画块什么也不做。音量将立即从起点立即变到0,而不会褪色。
第四个问题:我尚未对此进行测试,但我的假设是,当应用程序在后台运行时,此方法将无法正常工作。因此,在退出应用程序时使用此功能淡出音量的想法可能行不通。
有什么主意如何淡出音量而不在屏幕上显示任何内容? 答案不一定需要使用MPVolumeView,但是我需要它与MPMediaPlayer一起使用以及退出应用程序时使用。
编辑: 以下是我修改后的代码,该代码将使音量降低,但是在我的应用终止时能够执行此操作的问题仍然存在。我可以从“ appWillTerminate”调用此代码,但是由于应用程序终止才能完全循环,因此无法完全运行。
// Public in ViewController Class:
let volumeView = MPVolumeView()
var sliderView = UISlider()
var currentVolume:Float = 0
//This called by a notification:
@objc func fadeVolume(){
// A lot of other posts use these to hide the volume view however I only needed the alpha change
//volumeView.clipsToBounds = true
//volumeView.showsRouteButton = false
//volumeView.isHidden = true
//print("volume alpha \(volumeView.alpha)")
volumeView.alpha = 0.001
self.view.addSubview(volumeView)
volumeView.didMoveToSuperview()
if let view = volumeView.subviews.first as? UISlider {
sliderView = view
}
print("slider value: \(sliderView.value)")
currentVolume = sliderView.value
changeVolumeSlowly()
}
@objc func changeVolumeSlowly(){
sliderView.value = sliderView.value - 0.1
print("\(sliderView.value)")
if sliderView.value > 0 {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
self?.changeVolumeSlowly()
}
} else {
myMP.pause()
myMP.stop()
//reset
// Since the volumeView is 'global' to the app, if you do not change
// it back to the previous volume and make it visible you won't see it unless you restart your app.
//Unfortunately these cause the volume view to flash onscreen
volumeView.alpha = 1.0
sliderView.value = currentVolume
volumeView.removeFromSuperview()
}
}
答案 0 :(得分:0)
将您的UISlider变量公开,并使用此功能淡出音量。
@objc func changeVolumeSlowly(){
sliderView.value = sliderView.value - 0.1
print("\(sliderView.value)")
if sliderView.value > 0 {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
self?.changeVolumeSlowly()
}
}
}