2016-06-29 19 views
-3

私のViewControllerはまだ別のビューに入っていても配列の更新を送信していますが、何ができますか?ここに私のコードは次のとおりです。SwiftでViewControllerを停止するには?

import UIKit 
import CoreBluetooth 

class ViewController: UIViewController { 
var audioVibe : AudioVibes! 
var superpowered:Superpowered! 
var displayLink:CADisplayLink! 
var layers:[CALayer]! 
var magnitudeArray : [UInt16] = [0, 0, 0, 0, 0, 0, 0] 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // Setup 8 layers for frequency bars. 
    let color:CGColorRef = UIColor(red: 0, green: 0.6, blue: 0.8, alpha: 1).CGColor 
    layers = [CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer()] 
    for n in 0...7 { 
     layers[n].backgroundColor = color 
     layers[n].frame = CGRectZero 
     self.view.layer.addSublayer(layers[n]) 
    } 

    superpowered = Superpowered() 

    // A display link calls us on every frame (60 fps). 
    displayLink = CADisplayLink(target: self, selector: #selector(ViewController.onDisplayLink)) 
    displayLink.frameInterval = 1 
    displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes) 
} 

// Gets triggered when you leave the ViewController. 
override func viewWillDisappear(animated: Bool) { 
    superpowered.togglePlayback(); 
    superpowered.moritz(); 
    //delete(superpowered); 
} 

func onDisplayLink() { 
    // Get the frequency values. 
    let magnitudes = UnsafeMutablePointer<Float>.alloc(8) 
    superpowered.getMagnitudes(magnitudes) 

    // Wrapping the UI changes in a CATransaction block like this prevents animation/smoothing. 
    CATransaction.begin() 
    CATransaction.setAnimationDuration(0) 
    CATransaction.setDisableActions(true) 

    // Set the dimension of every frequency bar. 
    let originY:CGFloat = self.view.frame.size.height - 20 
    let width:CGFloat = (self.view.frame.size.width - 47)/5 
    var frame:CGRect = CGRectMake(20, 0, width, 0) 
    for n in 0...4 { 
     frame.size.height = CGFloat(magnitudes[n]) * 2000 
     frame.origin.y = originY - frame.size.height 
     layers[n].frame = frame 
     frame.origin.x += width + 1 
    } 

    // Set the magnitudes in the array. 
    for n in 0...6 { 
     magnitudeArray[n] = UInt16(magnitudes[n] * 32768) 
    } 

    // Update the array in the audioVibe class to trigger the sending command. 
    audioVibe.magnitudeArray = magnitudeArray 

    CATransaction.commit() 

    // Dealloc the magnitudes. 
    magnitudes.dealloc(8) 
} 

} 

私は何を行うことができ、私は彼の見解ではないんだけどながら、彼はaudioVibe.magnitudeArray = magnitudeArrayのようなことをやって停止するようにしたいですか?

ありがとうございます!

+1

どのような 'viewWill ...'と 'viewDid ...'関数を使用することを考えましたか? – Wain

答えて

0

あなたのviewDidLoadメソッドでは、CADisplayLinkを作成して実行ループに追加しています。

何もしないと、その表示リンクは、別のView Controllerを上に押してもアクティブのままです。

表示リンクを作成するコードを移動して、実行ループにviewWillAppearメソッドに追加する必要があります。

次に、実行ループから表示リンクを削除して無効にし、それを削除するコードをviewWillDisappearに追加する必要があります。

このようにして、ビューが表示されたら表示リンクコードを開始し、ビューが消えると停止します。

+0

runloopから削除するにはどうすればいいですか? – BurningTurtle

+0

CADisplayLinkのXcodeドキュメントをご覧ください。答えは**痛いほど**明白です。 –

+0

または、cjrieckが指摘しているように、表示リンクをそのまま残して一時停止することができます。 –

0

さまざまなビューに移行すると、リンクが一時停止しないように見えます。

pausedプロパティを使用して、このビューに戻ったときに表示リンクを一時停止して再開することができます。 viewWillDisappearで一時停止し、viewWillAppearに再開します。

関連する問題