음악 플레이어 디자인의 맥용 타이머 프로그램
- Swift
- SwiftUI
- AppKit
- Picker를 통한 hour, minutes, seconds 설정
- HH:MM:SS 형식으로 시간 표시
- 종료 5초 전 빨간색으로 변경되는 타이머 표시
- 실시간 프로그레스 바 표시
- 왼쪽: 진행 시간 / 오른쪽: 남은 시간
- 회전하는 레코드 판 애니메이션 (설정 시간 동안 1회전)
- Play/Pause: 타이머 일시정지 및 재생
- Backward: 설정 시간으로 초기화
- Forward: 타이머 및 설정 시간 초기화
- 종료 시 비프음 알림
프로그램을 테스트하는 동안 다음과 같은 현상이 매 테스트마다 동일하게 나타나는 것을 확인하였습니다.
- 타이머가 종료된 후에도 레코드 이미지가 회전된 상태로 남아 있음.
- 예상 동작: 타이머가 끝나면 이미지가 원래 위치(0도)로 돌아와야 함.
- 실제 동작: 타이머가 끝나도 회전된 상태가 유지됨.
- 타이머를 초기화했을 때 회전이 원래대로 돌아오지 않음.
- backward 버튼을 눌러도 회전이 초기화 되지 않음.
- 예상 동작: 재설정하면 회전이 0도로 돌아와야 함.
- 실제 동작: 회전이 마지막 위치에 그대로 멈춰 있음.
- 타이머를 다시 시작했을 때 레코드 이미지가 예상보다 빠르게 또는 느리게 회전하는 경우가 발생함
- 이전 타이머 종료 후 다시 시작할 때 회전 애니메이션이 비정상적으로 동작함.
- 예상 동작: 새 타이머가 시작되면 처음 위치에서 일정하게 회전해서 설정한 시간동안 정확히 한바퀴를 회전해야 함.
- 실제 동작: 이전 회전 값이 남아 있어 새 타이머에서도 영향을 미침.
-
타이머 종료 후 회전 상태 유지
- 예상: 타이머 종료 시 0도 위치로 복귀
- 실제: 회전 상태 유지됨
-
초기화 시 회전 리셋 실패
- 예상: backward 버튼으로 0도 위치로 복귀
- 실제: 마지막 회전 위치 유지
-
비정상적인 회전 속도
- 예상: 설정 시간 동안 정확히 1회전
- 실제: 이전 상태값 영향으로 속도 불규칙
- rotation 값 미초기화
- isPlaying false 상태에서 애니메이션 지속
- 애니메이션 종료 상태 미정의
- rotation 초기화 로직 추가
- 타이머가 종료되거나 초기화될 때 rotation = 0으로 설정하면 회전 애니메이션이 정상적으로 초기화될 것이라 가정.
- 기존의 restTimer() 함수에서 rotaiton 값을 초기화하도록 수정.
- 결과: 재설정 버튼을 누르면 rotation이 0으로 초기화되면서 처음 위치로 되돌아감.
- 애니메이션 제어 개선
- isPlaying이 false가 될 때 애니메이션이 자동으로 리셋되지 않는 문제를 해결해야 함.
- .animation(nil, value: rotaion)을 활용해 애니메이션을 강제로 중지
- 결과: 타이머가 멈추면 애니메이션이 중단됨.
- 자동 초기화 구현
- 타이머가 종료 시 회전 값을 0으로 초기화하는 로직이 없으므로 timerRemaining == 0이되면 회전을 자동으로 초기화하는 코드 추가.
- 결과: 타이머가 종료되면 rotation이 자동으로 초기화됨.
- SwiftUI의 .animation()은 isPlaying이 false가 되더라도 자동으로 애니메이션을 멈추지 않으므로, 명확하게 nil을 설정해야 함
- onReceive에서 상태를 관리할 때, 종료 조건을 세밀하고 명확히 처리해야 함
- 애니메이션의 상태를 초기화하는 과정이 중요하며, 회전 값을 수동으로 조정해야 함
