본문 바로가기

iOS/COURSE

[스파르타코딩클럽] iOS 앱개발 기초반 2주차

헉 한달만에 2주차를..ㅎㅎ

 

1.  타이머 생성과 애니메이션 추가하기

타이머를 보여주는 Label, 타이머 시작버튼, 타이머 남은 시간, 타이머 객체 생성

@IBOutlet weak var timerLabel: UILabel!
@IBOutlet weak var timerButton: UIButton!

var secondsLeft: Int = 180
var timer: Timer?

 

(타이머 버튼의 corner를 둥글게)

override func viewDidLoad() {
    super.viewDidLoad()
    
    timerButton.layer.cornerRadius = 10
}

 

타이머 초기화 - invalidate() 함수

func resetTimer() {
    timer?.invalidate()
    timer = nil
    timerButton.setTitle("타이머 시작하기", for: UIControl.State.normal)
}

 

타이머 객체의 시간이 바뀔 때마다 timerLabel의 시간을 업데이트

시간을 업데이트 할 때마다 애니메이션 효과 추가
몇개 해보니 바뀔 때의 애니메이션은 앞에 transition 붙은 옵션들을 선택해야 바뀌는듯 하다. (showHideTransitionViews 빼고)

func updateTimerLabel() {
    let minutes = self.secondsLeft / 60
    let seconds = self.secnodsLeft % 60
    
    // 10초 아래일 때 타이머 색을 빨간색으로 변경
    if self.secondsLeft < 10 {
    	self.timerLabel.textColor = UIColor.red
    }
   	else {
    	self.timerLabel.textColor = .black
    }
    
    // 애니메이션 효과 추가
    	UIView.transition(with: self.timerLabel, duration: 0.3, options: .transitionFlipFromBottom {
        	if self.secondsLeft > 0 {
            	self.timerLabel.text = String(format: "%02d:%02d", minutes, seconds)
            }
            else {
            	self.timerLabel.text = "시간 끝!"
            }
        } completion: { Bool in }
    }

 

타이머 동작하기 - scheduledTimer(withTimeInterval: , repeats: ) 함수

@IBAction func timerButtonClicked(_ sender: Any) {
	if timer != nil {
    	resetTimer()
        return
    }
    
    self.timerButton.setTitle("타이머 종료하기", for: .normal)
    self.secondLeft = 180 + self.segmentControl.selectedSegmentIndex * 60
    self.updateTimerLabel()
    
    // 타이머: 1초마다 호출
    timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { t in
    	self.secondsLeft -= 1
        self.updateTimerLabel()
        
        if self.secondsLeft == 0 {
        	self.resetTimer()
        }
    }
}

 

 

 

2.  Segmented Control 추가하기

segmentControl 객체

@IBOutlet weak var segmentControl: UISegmentedControl!

 

valueChangedSegmentControl 함수

@IBAction func valueChangedSegmentControl(_ sender: Any) {
        self.resetTimer()
        self.secondsLeft = 180 + self.segmentControl.selectedSegmentIndex * 60
        self.updateTimerLabel()
    }