Udemy iOS & Swift Bootcamp 8๊ฐ Egg Timer ๋ง๋ค๊ธฐ์ด๋ค.
soft, medium, hard ๊ณ๋์ ๋ง๋๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ , 1์ด๊ฐ ํ๋ฅผ ๋๋ง๋ค progress bar์ ์งํ์ํฉ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ๋ฉ์ธ ๊ธฐ๋ฅ์ด๋ค. ์ค๋กํฐ ์ฑ ๋ง๋ค๊ธฐ์์ ๋ฐฐ์ ๋ ๋ง์ง๋ง ์ข ๋ฃ ํจ๊ณผ์๋!
if/else๋ฌธ switch๋ฌธ, Dictionary, !? ํค์๋, @objc ํค์๋, Countdown Timer, UIProgressView ๋ฅผ ๋ฐฐ์ ๋ค.
๊ธฐ์ตํ๊ณ ์ถ์ ๋ถ๋ถ์ Timer์ฝ๋์ UIProgressView์ด๋ค.
1. Timer ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
//Timer ๊ธฐ๋ฅ ํต์ฌ์ฝ๋
var countdownTimer: Timer!
countdownTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
Timer๋ ํ์ด๋จธ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ํด๋์ค๋ค.
Timer.scheduledTimer์ ์ธ์๋ฅผ ์ดํด๋ณด์.
1) timeInterval: ์ผ๋ง๋งํผ์ ์๊ฐ๋งํผ Timer๋ฅผ ๋ฐ๋ณตํ ๊ฑด์ง. ex) 1.0์ด๋ฉด 1์ด์ด๊ณ 0์ด๋ ์์๊ฐ์ ์ ๋ ฅํ๋ฉด 0.0001์ด default๋ก ์คํ๋๋ค.
2) target: selector์๊ฒ ๋ณด๋ผ ๊ฐ์ฒด. self๋ฉด ๋ด ์์ ์ ๋ณด๋ธ๋ค.
3) selector: timerInterval ๊ฒฝ๊ณผ๋ง๋ค target์ ๋ณด๋ผ ํจ์๋ฅผ ์ ๋ ฅํ๋ค. ๋ updateTime์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ๊ฒฝ๊ณผ์๊ฐ ๋ง๋ค ํด์ผํ ์ผ์ ์ ์ด์ฃผ์๋ค.
4) userInfo: ํ์ด๋จธ์ ์ฌ์ฉ์ ์ ๋ณด๋ผ๋๋ฐ ๊ทธ๋ฐ๊ฑฐ ์์ผ๋๊น nil ์ด๋ผ๊ณ null๊ฐ ์ ๋ ฅํด์ฃผ๊ธฐ
5) repeats: Timer๋ฅผ timeInteval ๋ง๋ค ๋ฐ๋ณต์ํํ ์ง ์ฌ๋ถ๋ฅผ ์ ๋๊ฒ. true ๋ฉด ๋ฐ๋ณต์คํ, false๋ฉด ๋ฐ๋ณต์คํ ์ํจ. ๋ฐ๋ณต์คํ์, selector ํจ์์ ์กฐ๊ฑด์ ์ถ๊ฐํด์ค์ ์ผ์ ์กฐ๊ฑด์ด ๋๋ฉด Timer๋ฅผ ์ข ๋ฃํ๋ ์ฝ๋๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
//Timer ์ ์ฒด์ฝ๋
var countdownTimer: Timer!
var totalTime = 0
func startCountdown(timeValue: Int){
countdownTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
//object C ์์ ์ฌ์ฉํ๋ ํจ์๋ผ์ @objc ์ฃผ์์ด ๋ถ๋ ๊ฒ.
@objc func updateTime() {
if totalTime >= 0 {
totalTime -= 1
}
else {
endTimer()
}
}
func endTimer() {
titleText.text = "Done!"
playSound()
countdownTimer?.invalidate()
countdownTimer = nil
}
updateTime ์ ๊ทธ๋ฅ func ํค์๋๋ง ์ฐ๋ฉด ์๋ฌ๊ฐ๋๋ค. scheduledTimerํจ์๊ฐ Object-C์์ ๋์ด์จ ์ฝ๋๋ผ์ ํจ์ ์์ @objc ์ฐธ์กฐ ํค์๋๋ฅผ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
์์ธํ ๋ด์ฉ์ Apple Developer ๊ณต์๋ฌธ์ ์ฐธ๊ณ
2. ProgressBar ๋ง๋ค๊ธฐ
//ProgressBar ๊ธฐ๋ฅ ํต์ฌ์ฝ๋
@IBOutlet weak var progressBar: UIProgressView!
progressBar.progress = Float(passedSeconds) / Float(totalTime)
progress๊ฐ ์งํ๋ฐ๋ผ์ ์ด ์์น๋ฅผ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
0~1 ์ด %๊ฐ๋ ์ผ๋ก ๋์ด๋๋ ๊ฒ์ด๋ค. 0.1 ~ 0.5 ~ 0.9 ~ 1 == 10% ~ 50% ~ 90% ~ 100% ์ด๋ ๊ฒ.
์ด ๋, ์ ์/์ ์ = ์ ์๋ฅผ ๋ฐํํ๋ฏ๋ก ์ ์๊ฐ์ ๋๋๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ค์๋ก ๋ฐ๊ฟ์ ๋๋ ์ค์ผ ํ๋ค.
์๋๋ฉด 0์ด ๋์์ progress์ ์ ์ฉ์ด ์๋๋ค.
//ProgressBar ์ ์ฒด์ฝ๋
import UIKit
import AVFoundation
class ViewController: UIViewController {
var SECONDS = 1
var countdownTimer: Timer!
let eggTime = [
"Soft": 5, "Medium": 7, "Hard": 12
]
var totalTime = 0
var passedSeconds = 0
@IBOutlet weak var titleText: UILabel!
@IBOutlet weak var progressBar: UIProgressView!
var player: AVAudioPlayer?
@IBAction func onClickEgg(_ sender: UIButton) {
if countdownTimer != nil { endTimer() }
progressBar.progress = 0
passedSeconds = 0
let hardness = sender.currentTitle!
titleText.text = "\(hardness) Start"
startCountdown(timeValue: eggTime[hardness]!)
}
func startCountdown(timeValue: Int){
totalTime = timeValue * SECONDS
countdownTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
//object C ์์ ์ฌ์ฉํ๋ ํจ์๋ผ์ @objc ์ฃผ์์ด ๋ถ๋ ๊ฒ.
@objc func updateTime() {
if passedSeconds < totalTime {
print("\(passedSeconds) seconds")
passedSeconds += 1
progressBar.progress = Float(passedSeconds) / Float(totalTime)
}
else {
endTimer()
}
}
func endTimer() {
titleText.text = "Done!"
playSound()
countdownTimer?.invalidate()
countdownTimer = nil
}
func playSound() {
guard let url = Bundle.main.url(forResource: "alarm_sound", withExtension: "mp3") else { return }
do {
let player = try AVAudioPlayer(contentsOf: url)
player.play()
} catch let error {
print(error.localizedDescription)
}
}
}
Timer, Progress ๊ธฐ๋ฅ์ ํฌํจํ EggTimer ์์ฑ ์ฑ
[๋ง๋ ์ฑ์ Layout]
[์ ์ฒด์ฝ๋]
import UIKit
import AVFoundation
class ViewController: UIViewController {
var SECONDS = 1
var countdownTimer: Timer!
let eggTime = [
"Soft": 5, "Medium": 7, "Hard": 12
]
var totalTime = 0
var passedSeconds = 0
@IBOutlet weak var titleText: UILabel!
@IBOutlet weak var progressBar: UIProgressView!
var player: AVAudioPlayer?
@IBAction func onClickEgg(_ sender: UIButton) {
if countdownTimer != nil { endTimer() }
progressBar.progress = 0
passedSeconds = 0
let hardness = sender.currentTitle!
titleText.text = "\(hardness) Start"
startCountdown(timeValue: eggTime[hardness]!)
}
func startCountdown(timeValue: Int){
totalTime = timeValue * SECONDS
countdownTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
//object C ์์ ์ฌ์ฉํ๋ ํจ์๋ผ์ @objc ์ฃผ์์ด ๋ถ๋ ๊ฒ.
@objc func updateTime() {
if passedSeconds < totalTime {
print("\(passedSeconds) seconds")
passedSeconds += 1
progressBar.progress = Float(passedSeconds) / Float(totalTime)
}
else {
endTimer()
}
}
func endTimer() {
titleText.text = "Done!"
playSound()
countdownTimer?.invalidate()
countdownTimer = nil
}
func playSound() {
guard let url = Bundle.main.url(forResource: "alarm_sound", withExtension: "mp3") else { return }
do {
let player = try AVAudioPlayer(contentsOf: url)
player.play()
} catch let error {
print(error.localizedDescription)
}
}
}