我正在尝试按下音量按钮(手机左侧的按钮)时收到通知。我google了很多,似乎我应该使用mediaPlayer,但由于我是iOS新手,Swift无法运行。这是我的工作:
import UIKit
import MediaPlayer
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var mediaPlayer: MPMusicPlayerController = MPMusicPlayerController()
NSNotificationCenter.defaultCenter().addObserver(mediaPlayer,
selector: "volumeIsChanged:",
name: MPMusicPlayerControllerVolumeDidChangeNotification,
object: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func volumeIsChanged(notification: NSNotification){
println("Volume Is Changed")
}
}
PS:我知道,苹果不希望改变iPhone硬件的行为。
答案 0 :(得分:1)
试试这个:
func hookVolume() {
var volumeView = MPVolumeView(frame: CGRectMake(-500, -500, 0, 0))
self.window?.addSubview(volumeView)
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "volumeChanged:",
name: "AVSystemController_SystemVolumeDidChangeNotification",
object: nil)
}
func volumeChanged(notification: NSNotification) {
let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Float
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
hookVolume()
}
答案 1 :(得分:0)
对于Swift 4,更新的代码应该如下所示。也不要忘记删除观察者 - 总是
override func viewDidLoad() {
super.viewDidLoad()
// slider to visualize the volume change
var volumeView = UISlider(frame: CGRect(x:0,y:0,width:300,height:50))
volumeView.tag = 100
self.view.addSubview(volumeView)
//Add observer for the volume change event
NotificationCenter.default.addObserver(self, selector: #selector(NowPlayingViewController.volumeChanged(_:)), name: NSNotification.Name("AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
}
@objc func volumeChanged(notification: NSNotification) {
let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Float
print("Volume value:\(volume)")
//Get the slider by its tag
let volumeView = self.view.viewWithTag(100) as! UISlider
//Update the slider value to correspond to the volume
volumeView.value = volume
}
deinit {
// Don't forget to remove the observer
NotificationCenter.default.removeObserver(self,
name: Notification.Name("AVSystemController_SystemVolumeDidChangeNotification"),
object: nil)
}