将音量弹出框替换为更细微的方式,以便在用户使用音量键更改音量时显示音量。
当用户点击音量键时出现的 iOS 默认音量状态弹出框是一个巨大且突兀的光面视图,会遮盖显示的内容。 此库提供了一种显示更细微指示器的方式。 为确保不显示弹出框,需要满足两个条件
AVAudioSession
MPVolumeView
需要位于当前视图的层级结构中,并且其 alpha 值需要大于 0将 SubtleVolume
添加到视图后,会自动启动一个音频会话,并将视图的 alpha 值在隐藏状态下设置为 0.0001
。
使用其便捷初始化器之一创建 SubtleVolume
的实例,并设置其位置(您可以设置框架或让自动布局处理)
let volume = SubtleVolume(style: .plain)
volume.frame = CGRect(x: 0, y: 10, width: UIScreen.main.bounds.width, height: 4) // or wherever you like
设置 barTintColor 属性
volume.barTintColor = .red
如果需要,设置动画类型(不使用动画将导致指示器始终可见)
volume.animation = .slideDown
将视图添加到您的层级结构中
view.addSubview(volume)
要以编程方式更改音量
try? volume.setVolumeLevel(0.5)
或者使用便捷方法
try? volume.decreaseVolume(by: 0.2, animated: true)
try? volume.increaseVolume(by: 0.2, animated: true)
您可以提供一个辅助图像,该图像将显示在栏的左侧。 请参阅委托方法
func subtleVolume(_ subtleVolume: SubtleVolume, accessoryFor value: Double) -> UIImage? {
return value > 0 ? #imageLiteral(resourceName: "volume-on.pdf") : #imageLiteral(resourceName: "volume-off.pdf")
}
想要更花哨地在刘海区域显示音量条吗? 查看演示项目。 主要思路如下
class ViewController: UIViewController {
let volume = SubtleVolume(style: .rounded)
var statusBarVisible = true
// ...
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if view.safeAreaInsets.top > 0 {
volume.padding = CGSize(width: 2, height: 8)
volume.frame = CGRect(x: 16, y: 8, width: 60, height: 20)
} else {
// older phones here
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
override var prefersStatusBarHidden: Bool {
return !statusBarVisible
}
}
extension ViewController: SubtleVolumeDelegate {
func subtleVolume(_ subtleVolume: SubtleVolume, didChange value: Double) {
if !subtleVolume.isAnimating && view.safeAreaInsets.top > 0 {
statusBarVisible = true
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
func subtleVolume(_ subtleVolume: SubtleVolume, willChange value: Double) {
if !subtleVolume.isAnimating && view.safeAreaInsets.top > 0 {
statusBarVisible = false
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
}
一旦您的应用程序进入后台,您需要在它变为活动状态时恢复会话
NotificationCenter.default.addObserver(volume, selector: #selector(SubtleVolume.resume), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
SubtleVolume 会在 deinit 时自动删除观察者。
由 Andrea Mazzini 编写。 我们提供自由职业工作,请随时在此处 联系 我们。
想要支持 这些免费库 的开发吗? 通过 Paypal 给我买一杯咖啡 ☕️。
Copyright (c) 2017-2018 Andrea Mazzini. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.