web-dev-qa-db-ja.com

Swiftリピート時の音

私にはこの機能があり、最初のシーンでそれを実現します。

    func ThemeSound() {
        if let path = NSBundle.mainBundle().pathForResource("InfinityThemeMain", ofType: "wav") {
            let enemy1sound = NSURL(fileURLWithPath:path)
            println(enemy1sound)

            var error:NSError?
            ThemePlayer = AVAudioPlayer(contentsOfURL: enemy1sound, error: &error)
            ThemePlayer.prepareToPlay()
            ThemePlayer.play()
        }
    }

でも問題は、テーマを一度だけ再生することです。繰り返し再生する必要があります。そして、私はこれを実現する方法を知っていると思いました。

runAction(SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock(ThemePlayer), SKAction.waitForDuration(2.55)]))

ただし、runActionには子をアタッチする必要があるため、ViewControllerに貼り付けることはできません。私がそれをすることができる他の方法はありますか?

12
Betkowski

NumberOfLoopsプロパティを負の数に設定するだけです。

ThemePlayer.numberOfLoops = -1

から ドキュメント

numberOfLoopsサウンドが最後に到達したときに最初に戻って再生を繰り返す回数。

.。

var numberOfLoops:Int

.。

デフォルトの値0は、サウンドを1回再生することを意味します。正の整数値を設定して、最初に戻ってもう一度再生する回数を指定します。たとえば、値1を指定すると、サウンドが合計2回再生されます。 stopメソッドを呼び出すまで、サウンドを無期限にループするように負の整数値を設定します。

ローカル変数ではなく、AVAudioPlayerをプロパティにする する必要がある場合もあります。現状では、自動参照カウントを使用すると、ローカルのThemePlayerインスタンスがARCによって割り当て解除される可能性が高いと思います。私よりAVAudioPlayerをよく知っている人は、それについてコメントできるかもしれません。

(余談ですが、オブジェクトインスタンスに名前を付けるというAppleの規則に従って、小文字で始めることをお勧めします。たとえば、themePlayerではなくThemePlayerです。これにより、他の人がコードを読みやすくなります。 。)

36
Matt Gibson

Timer()を使用して繰り返します。コードは次のとおりです。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var player = AVAudioPlayer()

    var timer = Timer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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



    @IBAction func play(_ sender: UIButton) {

       // var player = AVAudioPlayer()


        let soundURL = Bundle.main.url(forResource: "beeb", withExtension: "wav")

        do {
            player = try AVAudioPlayer(contentsOf: soundURL!)
        } catch {
            print("No sound found by URL")
        }



        alertation(title: "click stop to stop", msg: "")


    }


    func alertation(title:String,msg:String)
    {

        player.play()
        self.timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: true, block: { (timer) in
            self.player.play()
        })



        var alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
        var stop = alert.addAction(UIAlertAction(title: "STOP", style: .default, handler: { (action) in

             self.player.stop()
            self.timer.invalidate()

        }))


        self.present(alert, animated: true, completion: nil)

    }



}
0
Neen