Guest User

Untitled

a guest
May 26th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.09 KB | None | 0 0
  1. ## アプリの中でボリュームボタンを監視する方法 (iOS & Swift)
  2.  
  3. iOSデバイスのカメラアプリはボリューム(+)ボタンを押し下げるとシャッターを切ります。ボリュームボタンの押し下げを検知すれば、Bluetoothリモートシャッターやヘッドセット(iPhoneに付属するイヤホンなど)を使って、自分のアプリをコントロールすることができます。
  4.  
  5. #### ボリュームボタン押し下げの監視を開始
  6.  
  7. ~~~
  8. func startListeningVolumeButton() {
  9. // MPVolumeViewを画面の外側に追い出して見えないようにする
  10. let frame = CGRect(x: -100, y: -100, width: 100, height: 100)
  11. volumeView = MPVolumeView(frame: frame)
  12. volumeView.sizeToFit()
  13. view.addSubview(volumeView)
  14.  
  15. let audioSession = AVAudioSession.sharedInstance()
  16. do {
  17. try audioSession.setActive(true)
  18. // AVAudioSessionの出力音量を取得して、最大音量と無音に振り切れないように初期音量を設定する
  19. let vol = audioSession.outputVolume
  20. initialVolume = Float(vol.description)!
  21. if initialVolume > 0.9 {
  22. initialVolume = 0.9
  23. } else if initialVolume < 0.1 {
  24. initialVolume = 0.1
  25. }
  26. setVolume(initialVolume)
  27. // 出力音量の監視を開始
  28. audioSession.addObserver(self, forKeyPath: "outputVolume", options: .new, context: nil)
  29. } catch {
  30. print("Could not observer outputVolume ", error)
  31. }
  32. }
  33. ~~~
  34.  
  35. #### ボリュームボタンの押し下げの監視を終了
  36.  
  37. ~~~
  38. func stopListeningVolumeButton() {
  39. // 出力音量の監視を終了
  40. AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume")
  41. // ボリュームビューを破棄
  42. volumeView.removeFromSuperview()
  43. volumeView = nil
  44. }
  45. ~~~
  46.  
  47. ### ボリュームビューの音量調整スライダーを操作することで音量を設定する
  48.  
  49. ~~~
  50. func setVolume(_ volume: Float) {
  51. (volumeView.subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(initialVolume, animated: false)
  52. }
  53. ~~~
  54.  
  55. #### 出力音量の変化とカメラ露出を監視する
  56.  
  57. ビューコントローラーのobserverValue()をオーバライドして出力音量の変化に対してアクションを実行します
  58.  
  59. ~~~
  60. ...
  61. import MediaPlayer
  62.  
  63. class MyViewController: ViewController {
  64. ...
  65. var initialVolume: Float = 0.0
  66. var volumeView: MPVolumeView!
  67. ...
  68. ...
  69.  
  70. override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  71. if keyPath == "outputVolume" {
  72. let newVolume = (change?[NSKeyValueChangeKey.newKey] as! NSNumber).floatValue
  73. // 出力音量が上がったか下がったかによって処理を分岐する
  74. if initialVolume > newVolume {
  75. // ボリュームが下がった時の処理をここに記述
  76. initialVolume = newVolume
  77. // ボリュームが0になってしまうと以降のボリューム(ー)操作を検知できないので、0より大きい適当に小さい値に設定する
  78. if initialVolume < 0.1 {
  79. initialVolume = 0.1
  80. }
  81. } else if initialVolume < newVolume {
  82. // ボリュームが上がった時の処理をここに記述
  83. initialVolume = newVolume
  84. // ボリュームが1になってしまうと以降のボリューム(+)操作を検知できないので、1より小さい適当に大きい値に設定する
  85. if initialVolume > 0.9 {
  86. initialVolume = 0.9
  87. }
  88. }
  89. // 一旦出力音量の監視をやめて出力音量を設定してから出力音量の監視を再開する
  90. AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume")
  91. setVolume(initialVolume)
  92. AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: .new, context: nil)
  93. }
  94. }
  95.  
  96. ...
  97. }
  98. ~~~
Add Comment
Please, Sign In to add comment