#59 少女之愛我,不愛我摘花瓣 App

Rose
彼得潘的 Swift iOS / Flutter App 開發教室
6 min readJun 14, 2021

學習亂數,AVSpeechSynthesizer 講話和 toggle()

傳說中,想知道對方是否喜歡自己,只要找一朵花,一邊摘花瓣,一邊數著 ”她愛我,她不愛我”,摘到最後一片時若是她愛我,即表示她真的愛我。

功能:

  • 點選花瓣摘花。
  • 除了畫面上顯示愛我,不愛我,也會用 AVSpeechSynthesizer 大聲唸出。
  • 搭配 Swift 4.2 的新語法,比方 toggle()
  • 人物隨著愛與不愛切換不同表情

1. 點選花瓣摘花

畫面先製作一個花瓣的 Button

定義 變數 var isLove = true

使用 toggle() 語法,每點一次按鈕就會切換 isLove = true 或 isLove = false

建立物件 IBOutlet

@IBOutlet weak var petalsButton: UIButton!
@IBOutlet weak var loveLabel: UILabel!
@IBOutlet weak var girlImageView: UIImageView!

花瓣按鈕的 IBAction

如果 isLove 是 true,就顯示”他愛我”

@IBAction func press(_ sender: UIButton) {

isLove.toggle()

if isLove == true {
loveLabel.text = "他愛我"
girlImageView.image = UIImage(named: "yes")
} else{
loveLabel.text = "他不愛我"
girlImageView.image = UIImage(named: "not")
}
}

2. 用語音唸出文字

因為覺得要設定個好聽的速度音調不容易,所以還是放了可以調整的Slider

詳細作法參考之前的文章

新增可以控制音調與速度的 Slider,並建立 IBOutlet

@IBOutlet weak var speakMultiplier: UISlider!
@IBOutlet weak var speakRate: UISlider!
@IBOutlet weak var speakMultiplierLabel: UILabel!
@IBOutlet weak var speakRateLabel: UILabel!

建立音調速度 Slider 的 IBAction

並將語音寫成一個 function

// 音調速度
@IBAction func changeSlider(_ sender: UISlider) {
speakRateLabel.text = String(format: "%.2f", speakRate.value)
speakMultiplierLabel.text = String(format: "%.2f", speakMultiplier.value)
}
func speak() {
let utterance = AVSpeechUtterance(string: loveLabel.text!)
let synthesizer = AVSpeechSynthesizer()
utterance.voice = AVSpeechSynthesisVoice(language: "zh-TW")
utterance.rate = speakRate.value
utterance.pitchMultiplier = speakMultiplier.value
synthesizer.speak(utterance)
}

press按鈕 裡加入 speak() 語音函式

語音不能直接加在按鈕的程式碼開頭,因為這樣唸出的字串會跟文字不一樣

要加在 if else 裡,所以寫成 function 只要加入 speak() 即可

@IBAction func press(_ sender: UIButton) {
// toggle() = 切換true或false
isLove.toggle()
print(isLove)


if isLove == true {
loveLabel.text = "他愛我"
girlImageView.image = UIImage(named: "yes")
speak()
} else{
loveLabel.text = "他不愛我"
girlImageView.image = UIImage(named: "not")
speak()
}
}

自訂Slider 小花圖案

override func viewDidLoad() {
super.viewDidLoad()

// 自訂Slider圖案
speakMultiplier.setThumbImage(UIImage(named: "flowers-icon"), for: .normal)
speakRate.setThumbImage(UIImage(named: "flowers-icon"), for: .normal)
}

完成畫面

--

--

Rose
彼得潘的 Swift iOS / Flutter App 開發教室

Coding & Design 一直在學習的路上,從未停止,一有空檔就會摸摸我的兔子🐰