2014-12-30 31 views
0

如何在customView類中使用getLevel()的值?該功能與NSTimer相關聯。該值是一個mp3文件的分貝值,我想用內部customView與動畫在不同的類中使用函數()變量 - Swift

class customView: UIView { 

// get getLevels() value 

} 


class ViewController: UIViewController, AVAudioPlayerDelegate { 


override func viewDidLoad() { 
    super.viewDidLoad() 



    var bundle = NSString(string: NSBundle.mainBundle().pathForResource("guitar", ofType: "mp3")!) 
    var error: NSError? = nil 
    player = AVAudioPlayer(contentsOfURL: NSURL(string: bundle), error: &error) 
    player.delegate = self 
    player.volume = 1.0 
    player.meteringEnabled = true 
    player.play() 



    var timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("getLevel"), userInfo: nil, repeats: true) 

} 


func getLevel() { 

    if (player.playing == true) { 

     player.updateMeters() 
     var dblevel = player.averagePowerForChannel(1) 
     var percentage = CGFloat(pow(10, (0.05 * dblevel)) * 100) 

     // This prints out the the decibel levels from 0.0 to 100.0 every 0.1 sec 
     println(percentage) 


    } 

} 

我需要的變量是「百分比」同步的分貝值。我有什麼選擇可以做到這一點?感謝Godart。

回答

1

評論中的代碼應該是所有你需要明白這一點:

class CustomView: UIView { 
    var percentage: CGFloat = 0.0 { 
     didSet { 
      setNeedsDisplay() // this will cause the system to tell the view to draw itself. 
     } 
    } 

    func drawRect(rect: Rect) { 
     // draw yourself based on percentage 
    } 
} 

class ViewController: ... { 
    func getLevel() { 

     if (player.playing == true) { 

      player.updateMeters() 
      var dblevel = player.averagePowerForChannel(1) 
      var percentage = CGFloat(pow(10, (0.05 * dblevel)) * 100) 

      myCustomView.percentage = percentage // this is how to pass the information. 
     } 
    } 
} 
+0

感謝didSet {}這份工作! –

0

遵循模型 - 視圖 - 控制器設計模式,您的ViewController應負責處理模型信息並將其傳遞給您的視圖以向用戶顯示信息。因此,你應該在你的視圖控制器類創建一個變量來存儲CustomView:

class ViewController: UIViewController, AVAudioPlayerDelegate { 


override func viewDidLoad() { 
    super.viewDidLoad() 


    // new var to store the customView if you're using Storyboards 
    @IBOutlet var customView: CustomView! 
    // new var to store the customView without using Storyboards 
    var customView: CustomView? 

    var bundle = NSString(string: NSBundle.mainBundle().pathForResource("guitar", ofType: "mp3")!) 
    var error: NSError? = nil 
    player = AVAudioPlayer(contentsOfURL: NSURL(string: bundle), error: &error) 
    player.delegate = self 
    player.volume = 1.0 
    player.meteringEnabled = true 
    player.play() 



    var timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("getLevel"), userInfo: nil, repeats: true) 

} 

這將允許你在你的CustomView直接從您的控制器更新值,你可以使用getLevel()的方法來做到這一點。如果您只需要函數內的percentage值,那麼我建議您在自己的方法中計算百分比,以便可以在多個位置使用百分比而不重複代碼。

func calculatePercentage() -> CGFloat { 

    let dblevel = player.averagePowerForChannel(1) 

    return CGFloat(pow(10, (0.05 * dblevel)) * 100) 

} 

然後,您可以使用該方法而不是一遍又一遍地輸入相同的代碼。

func getLevel() { 

    if (player.playing == true) { 

    player.updateMeters() 
    let percentage = calculatePercentage() 

    // This prints out the decibel levels from 0.0 to 100.0 every 0.1 sec 
    println(percentage) 

    } 

} 

某處,當你準備更新您的視圖您的視圖控制器,你可以通過這樣的比例:

self.customView.updateView(percentage: calculatePercentage()) 
相關問題