2017-04-21 82 views
2

你好,有一堆相關的問題,但我會說,他們都沒有給出明確的答案如何捕捉與音量按鈕的照片。iOS。用音量按鈕捕捉照片

目前我將觀察者添加到AVAudioSession實例,但它不適用於最大和最小音量值,並且似乎顯示相機彈出的音量狀態陰影。

private func setupButtonsListener(){ 
    do { 
     let audioSession = AVAudioSession.sharedInstance() 
     try audioSession.setActive(true) 

     audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) 
    } catch { 
     print("Error") 
    } 

} 

然後我在功能處理事件:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == "outputVolume" { 
     capturePhoto() // Same function which I use for capturing photo for screen button. 
    } else { 
     super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
    } 
} 

您建議我將任何解決方案: 1.工作,即使最大/最小體積值達到。 2.不會顯示在屏幕上彈出的音量值。

編輯:基於@ jayesh-kanzariya答案我添加了如何在斯威夫特使用JPSVolumeButtonHandler

  1. 添加pod 'JPSVolumeButtonHandler'到您的吊艙文件。
  2. 在項目的根執行pod install
  3. 配置橋接文件爲您的項目,並添加有:#import <JPSVolumeButtonHandler/JPSVolumeButtonHandler.h>
  4. 在你的ViewController添加以下代碼:

    import JPSVolumeButtonHandler 
    
    class YourViewController { 
        var volumeHandler: JPSVolumeButtonHandler? 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
    
         self.volumeHandler = JPSVolumeButtonHandler(up: {self.capturePhoto()}, downBlock: {self.capturePhoto()}) 
    
         ... 
        }  
    } 
    

完成!

回答

1

1)對於音量變化 您需要實現您自己的「MPVolumeView」,確保此視圖位於可見邊界之外的某處(將其alpha設置爲零或隱藏它,將禁用您的視圖並呈現衆所周知的蘋果音量控制) 例如x偏移量-20,Y-offsrt -20和寬度/高度等於0

import MediaPlayer 

let volumeView = MPVolumeView() 
volumeView.frame = CGRect(x: -20, y: -20, width: 0, height: 0); 

2)爲了得到用於體積變化持續更新,即使它已經達到最大/最小 正如您已經註冊爲觀察者爲AVAudioSession。我剛剛收到事件後將AVAudioSession的音量重置爲0.1和0.9之間的值(無論您需要增加/減少音量)。

case let volumeSlider as UISlider in volumeView.subviews { 
    volumeSlider.value = 0.2 
}