【问题标题】:Making a non-instantaneous change with an @IBAction button in Swift在 Swift 中使用 @IBAction 按钮进行非即时更改
【发布时间】:2016-03-15 03:22:31
【问题描述】:

我试图在单击我的应用程序中的按钮时更改我的 AVSpeechUtterance 的语速属性的值。然后,当我按下“说话”按钮时,我希望这个值继续存在。

如果这个解释不够清楚,想象一下:

共有三个按钮:一、二和三。 当用户按下 1 时,话语速率的值会发生变化(2 和 3 也是如此)。

然后在按下前三个按钮之一后,用户按下另一个按钮来激活话语。该话语将继承速率值并将其应用于语音。

这是我尝试过但不起作用的代码:

import UIKit
import AVFoundation

class SecondViewController: UIViewController {

@IBOutlet var minutesLabel: UITextField!

@IBOutlet var secondsField: UITextField!

func speak(sender: AnyObject) {

    let speechUtterance = AVSpeechUtterance(string:exampleSpeech)

    speechSynthesizer.speakUtterance(speechUtterance)
}

@IBOutlet var result: UILabel!

@IBAction func verySlow(sender: UIButton) {

    let verySlowButtonPressed = true

    let talkingSpeed = 90

    let minutesValue : Double = (minutesLabel.text as NSString!).doubleValue
    let secondsValue = (secondsField.text as NSString!).doubleValue
    let secondsToMinutes = secondsValue / 60
    let compiledTime = Double(minutesValue) + Double(secondsToMinutes)
    let resultingWords = Double(compiledTime) * Double(talkingSpeed)
    let resultCeiling = ceil(resultingWords)

    result.text = "\(String(format: "%.0f", resultCeiling)) words"

    if verySlowButtonPressed {

        speechUtterance.rate = 0.25
        speechUtterance.pitchMultiplier = 0.25
        speechUtterance.volume = 0.75
    }

}


@IBAction func speakButton(sender: AnyObject) {

    speak(exampleSpeech)
}

【问题讨论】:

    标签: ios xcode swift


    【解决方案1】:

    在您的speak 函数中,您每次调用它时都会创建一个新的AVSpeechUtterance 实例。当你的verySlow 函数被调用时,它会设置ratepitchMultipliervolume,我假设是一个名为speechUtterance 的类属性。由于每次调用时都会在speak 中创建一个新的AVSpeechUtterance,因此您在verySlow 中设置的那些属性不会在同一个实例上设置。

    解决此问题的一种方法是在您的类中创建ratepitchMultipliervolume 属性,在您的verySlow 函数中设置这些,然后将它们设置为speechUtterance 在您的 speak 函数中创建它之后。

    类似:

    var rate: Float?
    var pitchMultiplier: Float?
    var volume: Float?
    
    func speak(sender: AnyObject) {
    
        let speechUtterance = AVSpeechUtterance(string:exampleSpeech)
    
        if let rate = self.rate { 
            speechUtterance.rate = rate 
        }
        if let pitchMultiplier = self.pitchMultiplier { 
            speechUtterance.pitchMultiplier = pitchMultiplier 
        }
        if let volume = self.volume { 
            speechUtterance.volume = volume 
        }
    
        speechSynthesizer.speakUtterance(speechUtterance)
    }
    
    @IBAction func verySlow(sender: UIButton) {
    
        // ... whatever other code you need here ...
    
        self.rate = 0.25
        self.pitchMultiplier = 0.25
        self.volume = 0.75
    
    }
    

    【讨论】:

    • 非常感谢。使用“this”的你一定是 Java 人哈哈
    • @JoeySmith 哈哈,哎呀。我在日常工作中做了很多 javascript...一定是溜进去了。我修好了。
    【解决方案2】:

    不确定,但这些是语速的值,请尝试使用它们。我希望它有所帮助。

    iOS 9 非常慢 -- 0.42 较慢 -- 0.5 我的正常 - 0.53 更快——0.56

    iOS 早期版本的值有所不同,请在实施解决方案时牢记这一点。

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2016-10-18
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多