VolumeControl.swift 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. //
  2. // VolumeControl.swift
  3. // ALCameraViewController
  4. //
  5. // Created by Alex Littlejohn on 2016/03/26.
  6. // Copyright © 2016 zero. All rights reserved.
  7. //
  8. import UIKit
  9. import MediaPlayer
  10. typealias VolumeChangeAction = (Float) -> Void
  11. public class VolumeControl {
  12. let changeKey = "AVSystemController_SystemVolumeDidChangeNotification"
  13. lazy var volumeView: MPVolumeView = {
  14. let view = MPVolumeView()
  15. view.frame = CGRect(x: 0, y: 0, width: 1, height: 1)
  16. view.alpha = 0.01
  17. return view
  18. }()
  19. var onVolumeChange: VolumeChangeAction?
  20. init(view: UIView, onVolumeChange: VolumeChangeAction?) {
  21. self.onVolumeChange = onVolumeChange
  22. view.addSubview(volumeView)
  23. view.sendSubviewToBack(volumeView)
  24. try? AVAudioSession.sharedInstance().setActive(true)
  25. NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged), name: NSNotification.Name(rawValue: changeKey), object: nil)
  26. }
  27. deinit {
  28. try? AVAudioSession.sharedInstance().setActive(false)
  29. NotificationCenter.default.removeObserver(self)
  30. onVolumeChange = nil
  31. volumeView.removeFromSuperview()
  32. }
  33. @objc func volumeChanged() {
  34. guard let slider = volumeView.subviews.filter({ $0 is UISlider }).first as? UISlider else { return }
  35. let volume = AVAudioSession.sharedInstance().outputVolume
  36. slider.setValue(volume, animated: false)
  37. onVolumeChange?(volume)
  38. }
  39. }