ios - 为 Swift 2.0 集成音频和加速度计? (使用核心运动)

标签 ios xcode swift audio core-motion

import CoreMotion    
var ButtonAudio4URL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Swing", ofType: "wav")!)
var ButtonAudioPlayer4 = AVAudioPlayer()
 do {
        try ButtonAudioPlayer4 = AVAudioPlayer(contentsOfURL: ButtonAudio4URL)
        ButtonAudioPlayer4.prepareToPlay()
    } catch {
        print("audioPlayer failure")
    }   
func play() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.play()
}
func play2() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.play()
}
func play3() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.play()
}
func stop() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.stop()
}
func stop2() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.stop()
}
func stop3() {
    ButtonAudioPlayer4.currentTime = 0
    ButtonAudioPlayer4.stop()
}
lastDirection = 0 //Idle accel
    threshold = 1.0 //Minimum positive(right) accel
    nthreshold = -1.0 //Minimum negative(left) accel

    if motionManager.accelerometerAvailable {
        let queue = NSOperationQueue()
        motionManager.startAccelerometerUpdatesToQueue(queue, withHandler: {
            data, error in
            guard let data = data else{
                return
            }

    // Get the acceleration
    let xAccel = data.acceleration.x    //X accel
    let yAccel = data.acceleration.y    //Y accel
    let zAccel = data.acceleration.z    //Z accel
    let xPositive = xAccel > 0  //Positive(right) x accel
    let xNegative = xAccel < 0  //Negative(left) x accel
    let yPositive = yAccel > 0  //Positive(up) y accel
    let yNegative = yAccel < 0  //Negative(down) y accel
    let zPositive = zAccel > 0  //Positive(front) z accel
    let zNegative = zAccel < 0  //Negative(back) z accel

    // Run if the acceleration is higher than theshold
    if abs(xAccel) > self.threshold {

        //If moved right
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && xPositive {
                self.lastDirection = 1
                print("Up")
                self.play()
        } else if self.lastDirection !=     -1 && !xPositive {
            self.lastDirection = -1
            print("Down")
            self.play()
        }
        }
    }

    // Run if the acceleration is higher than ntheshold
    if abs(xAccel) < self.nthreshold {

        //If moved left
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && xNegative {
                self.lastDirection = 1
                print("Up")
                self.play2()
        } else if self.lastDirection !=     -1 && !xNegative {
            self.lastDirection = -1
            print("Down")
            self.play2()
        }
        }
    }

    // Run if the acceleration is higher than theshold
    if abs(yAccel) > self.threshold {

        //If moved up
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && yPositive {
                self.lastDirection = 1
                print("Up")
                self.play()
        } else if self.lastDirection !=     -1 && !yPositive {
            self.lastDirection = -1
            print("Down")
            self.play()
        }
        }
    }

    // Run if the acceleration is higher than ntheshold
    if abs(yAccel) < self.nthreshold {

        //If moved left
        dispatch_async(dispatch_get_main_queue()) {
            if self.lastDirection != 1 && yNegative {
                self.lastDirection = 1
                print("Up")
                self.play2()
        } else if self.lastDirection !=     -1 && !yNegative {
            self.lastDirection = -1
            print("Down")
            self.play2()
    }
    }
    }

    // Run if the acceleration is higher than theshold
    if abs(zAccel) > self.threshold {

    //If moved front
    dispatch_async(dispatch_get_main_queue()) {
    if self.lastDirection != 1 && zPositive {
    self.lastDirection = 1
    print("Up")
    self.play()
    } else if self.lastDirection !=     -1 && !zPositive {
    self.lastDirection = -1
    print("Down")
    self.play()
    }
    }
    }

    // Run if the acceleration is higher than theshold
    if abs(zAccel) < self.nthreshold {

    //If moved back
    dispatch_async(dispatch_get_main_queue()) {
    if self.lastDirection != 1 && zNegative {
    self.lastDirection = 1
    print("Up")
    self.play2()
    } else if self.lastDirection !=     -1 && !zNegative {
    self.lastDirection = -1
    print("Down")
    self.play2()
    }
    }
    }

    })

    }

您好, 我已经为 i0S 9.2 使用 Xcode 7.2、Swift 2.0 构建了一个 iOS 应用程序 我想添加一个功能,当用户在空中挥动他们的设备时,会播放声音。我的问题是,虽然有声音播放,但是突然停止,在播放声音的过程中再次移动时又重新播放。我希望声音只播放一次,没有任何重叠或停止。我已经包含了与 CoreMotion 相关的所有代码,并排除了所有其他代码。 谢谢。

最佳答案

如果我确实理解您的目的,您可能希望有一个 bool 屏障来防止重复播放。

例如:


    var isPlaying1 = false

    func play() {
        if self.isPlaying1 == true {
            return
        }
        ButtonAudioPlayer4.currentTime = 0
        ButtonAudioPlayer4.play()
        self.isPlaying1 = true
    }

    func stop() {
        if self.isPlaying1 == false {
            return
        }
        ButtonAudioPlayer4.currentTime = 0
        ButtonAudioPlayer4.stop()
        self.isPlaying1 = false
    }

关于ios - 为 Swift 2.0 集成音频和加速度计? (使用核心运动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35196009/

相关文章:

objective-c - 如何通过 segue 将数组传递给 tableviewcontroller

ios - 无法在 Xcode 控制台中从 Objective-C 记录 Swift 单例

ios - Xcode UI 不显示我创建的核心数据实体

objective-c - 找不到 SystemConfiguration/SystemConfiguration.h 文件

iPhone X 模拟器上的 iOS slider 滞后

ios - 如何更新 CloudKit 中记录类型的字段?

ios - 将数组保存为核心数据中的数据的正确方法是什么?

ios - 一个对象有多个委托(delegate)? (跟进)

ios - UIWebView 开始加载但从未完成

ios - 使用选择器 'touchesBegan:withEvent:' 的重写方法具有不兼容的类型 '(NSSet, UIEvent) -> ()'