Pomodoro Timer

Woozoo·2023년 1월 2일
0

깃헙스위프트기초

목록 보기
33/38

Pomodoro Timer

UI구성하기

필요한 요소들 준비

IBOutlet과 IBAction을 연결하자
그리고 duration 이라는 변수도 선언해줬다
(시간 선택되면 몇초인지 담아둘 용도)

datePicker의 프로퍼티 countDownDuration은 현재 몇초로 설정이 되어 있는지 알려준다
=> duration에 넣어주면 되겠죠

휠을 돌리고 시작 버튼 누르면 해당 초를 가지고 올 수 있게됨

Time Status 열거형으로 준비하자

enum TimeStatus {
    case start
    case pause
    case end
}
//---
var timeStatus: TimeStatus = .end


그리고 시작 버튼이 눌리면 열거형의 값을 switch case로 바꿀 수 있게 해주었다


시작 버튼이 눌리면 label과 progressView를 숨길 수 있게 메소드하나 파주고

각각의 케이스에 맞는 값들을 넘겨줬다



버튼 상태에 맞는 상태들로 ui띄울 수 있게 해줌


많이 하드코딩이다. 더 나은 구조는 없을까...


기능 구현하기

var timer: DispatchSourceTimer?를 전역변수로 선언하자

타이머가 시작되는 로직을 메소드로 빼주었다
timer가 닐이 아닐 경우 DispatchSourc의 타이머를 메인 스레드에서 실행될 수 있게 새로운 타이머를 만들어주고
schedule로 지금부터 시작되고, 1초마다 반복이 되게
그리고 실행되는 로직은 현재의 초가 1씩 감소하게끔!
만약에 현재의 초가 0보다 작게 된다면 타이머가 종료되는 분기점도 만들어주고
resume을 통해서 타이머를 시작한다


오케이!!

타이머를 멈출 때 메소드 작성해줌

cancelButton누를 때 해야하던 것들도 stoptimer에 그냥 다 넣어줌

근데 현재 상태에서 일시정지일 때 취소 (stopTimer) 하게 되면 수행되어야할 작업이
남은 상태에서 timer에 nil이 남는 거라서 처리해줘야겠다


오케이!

타임 레이블 표시하기


guard let self = self 로 스트롱 레퍼런스가 되도록 해줬다!
(찾아보자)

그리고 들어온 currentSeconds를
시분초로 나누어주는 로직 작성!
String Format으로 2자리씩 나오게끔 해줬다


프로그레스뷰도 업데이트 되게 현재의초를 duration으로 나눈 값이
프로그레스뷰의 프로그레스에 할당되게 해줌

알람 소리 구현!

import AudioService 프레임웤 임포트 해주고

타이머가 종료 되는 부분에서

소리를 넣어주자
소리들은 iphondev.wiki에서 볼 수 있음
1005번으로 넣어줬다

UIView 애니메이션 해주자

isHidden으로 선언해줬던 것들을 알파값 변경으로 크로스 디졸브 되게 해보자

기존에 있던 거 삭제해주고
(메인스토리보드에서 isHidden 체크해제하고 알파로 바꿔줌)

UIView의 애니메이트 메소드를 사용해서 바꿔줬다!

이미지뷰도 뱅글뱅글 돌아가게 설정해보자

이미지뷰 IBOutlet연결해주고 타이머가 시작되는 클로져 안에서
CGAffineTransform으로 180도 돌려지게 구현해줬다 (.pi)


그리고 타이머가 멈추면 원래대로 돌아올 수 있게 해줌

profile
우주형

0개의 댓글