2014年8月1日 星期五

[iOS] 調整系統音量(System Volume)_ Swift

因為有網友提出討論,所以就花了點時間研究了一下,順便練習把Objective-C的程式碼改寫成Swift,有需要的人可以參考一下喔!寫法上是有一些差異,但是應該看得懂,也比較好轉換回去Objective-C(因為比較熟咩~),如果是需要Objective-C的版本,可以參考「相關文章」,本篇文章較之前多了監聽實體按鍵的部分。

接下來,只要Copy & Past(喂!沒個正經)就可以獲得一個可互動、調整系統音量的ScrollBar,以及一個當使用者按下機身左側的音量實體按鈕時,會跟著顯示當前音量數值的Label(ScrollBar本身就會跟著動,但是有時候我們會有心想把它隱藏起來XD)

介面安置
不過在這之前,我們需要先在storyboard上安置一個view以及一個label,然後與你的程式碼作連結,如下。
// Storyboard上的一些介面元素連結
@IBOutlet var mpVolumeViewParentView: UIView
@IBOutlet var volumeLabel: UILabel
加入Framework
在專案中加入兩個Framework:MediaPlayer.Framework以及AVFoundation.framework,並且匯入檔案,如下。
import MediaPlayer
import AVFoundation
音樂準備
將要播放的音樂拉進專案中,記得將copy的那個選項勾起來。(在完整程式碼中標示出的紅字,麻煩請改成此音樂的檔名跟檔案格式~)

以上就完成準備動作,接下來就不多說,直接來看完整的程式碼囉!

完整程式碼
import UIKit
import MediaPlayer
import AVFoundation

class ViewController: UIViewController {
    // Storyboard上的一些介面元素連結
    @IBOutlet var mpVolumeViewParentView: UIView
    @IBOutlet var volumeLabel: UILabel

    let volumeView = MPVolumeView()
    var audioPlayer = AVAudioPlayer()
    let musicPlayerController = MPMusicPlayerController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 把volumeView實體顯示在舞台上設置的UIView(mpVolumeViewParentView)裡面,並且把大小設置成與其相同
        mpVolumeViewParentView.backgroundColor = UIColor.clearColor();
        volumeView.frame = mpVolumeViewParentView.bounds
        mpVolumeViewParentView.addSubview(volumeView)
        
        // 播放音樂
        var music = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("UetoAya", ofType: "mp3"))
        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: music, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
        
        // 監聽音量實體按鈕
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "getInstanceVolumeButtonNotification:", name:"AVSystemController_SystemVolumeDidChangeNotification", object: nil)
    }
    
    // 接收到音量改變處理
    func getInstanceVolumeButtonNotification(notification: NSNotification) {
        
        var info = notification.userInfo
        var volume = info["AVSystemController_AudioVolumeNotificationParameter"] as NSValue
        println("音量改變:\(volume)")
        
        showCurrentVolumeText(volume)
    }
    
    // 顯示音量文字
    func showCurrentVolumeText(currentVolume:NSValue) {
        
        self.volumeLabel.text = "\(currentVolume)"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

運作起來長這樣


外部參考資料/相關連結:
  • 獲取音量實體按鍵事件的方法:link
  • 監聽案件音量:link
  • NSNotification相關的資料:link
相關文章:
  • [iOS] 調整系統音量(System Volume)_ Objective-C:link