iOS 실무 3주차

2025. 3. 20. 16:41iOS앱개발

iOS로 무드등 앱 개발 기획서

 

1. 프로젝트 준비 (2025년 3월 1일 ~ 3월 7일)
팀 구성 및 역할 분담
개발 환경 설정 (Xcode, Swift 설치)
프로젝트 목표 및 요구사항 정의


2. UI/UX 디자인 (2025년 3월 8일 ~ 3월 21일)
사용자 플로우 및 와이어프레임 제작
UI 디자인 (Figma, Adobe XD 등 사용)
사용자 피드백 수집 및 수정


3. 기능 개발 (2025년 3월 22일 ~ 5월 15일)
1단계: 기본 기능 구현 (2025년 3월 22일 ~ 4월 15일)
화면 밝기 조절 기능
색상 변경 기능
타이머 기능 구현
2단계: 고급 기능 구현 (2025년 4월 16일 ~ 5월 1일)
사용자 설정 저장 기능
자동 조정 기능 (예: 일출/일몰)
3단계: 최적화 및 버그 수정 (2025년 5월 2일 ~ 5월 15일)
성능 최적화
테스트 및 버그 수정


4. 테스트 및 피드백 (2025년 5월 16일 ~ 5월 23일)
사용자 테스트 진행
피드백 수집 및 개선 사항 반영
최종 버그 수정


5. 배포 준비 (2025년 5월 24일 ~ 5월 28일)
App Store 제출 준비
마케팅 자료 준비 (스크린샷, 설명 등)
사용자 매뉴얼 작성


6. 배포 및 출시 (2025년 5월 29일)
App Store에 앱 제출
출시 발표 및 마케팅 활동 시작


7. 사후 관리 (2025년 5월 30일 이후)
사용자 피드백 모니터링
업데이트 및 유지보수 계획 수립

 

  • Portrait (세로 모드): 기본적으로 iPhone이 세로 모드에서 실행됩니다.
  • Upside Down (거꾸로 세로 모드): iPhone을 뒤집어서 사용할 수 있도록 허용합니다.
  • Landscape Left (가로 모드 - 왼쪽 회전): 기기를 왼쪽으로 회전했을 때 가로 모드로 실행할 수 있도록 설정합니다.
  • Landscape Right (가로 모드 - 오른쪽 회전): 기기를 오른쪽으로 회전했을 때 가로 모드로 실행할 수 있도록 설정합니다

 

swift  생명주기 메소드

 

VIEW 

 

viewDidLoad()
설명: 뷰 컨트롤러가 메모리에 로드될 때 호출됩니다.
용도: 초기화 작업을 수행합니다. 뷰의 구성 요소를 설정하거나, 데이터 초기화 등을 여기서 진행합니다. 이 메소드는 딱 한 번만 호출됩니다.


viewWillAppear(_:)
설명: 뷰가 화면에 나타나기 직전에 호출됩니다.
용도: 뷰가 나타나기 전에 필요한 작업을 수행합니다. 예를 들어, 데이터를 새로 고치거나 UI를 업데이트하는 등의 작업을 합니다. 이 메소드는 뷰가 표시될 때마다 호출됩니다.


viewDidAppear(_:)
설명: 뷰가 화면에 나타난 후 호출됩니다.
용도: 화면에 표시된 후에 데이터를 표시하거나 애니메이션을 시작하는 등의 작업을 수행합니다. 뷰가 완전히 나타난 후 실행되므로, UI 업데이트가 필요할 때 유용합니다.


viewWillDisappear(_:)

설명: 뷰가 화면에서 사라지기 직전에 호출됩니다.
용도: 뷰가 사라지기 전 필요한 정리 작업을 수행합니다. 예를 들어, 타이머를 중지하거나, 데이터 저장을 준비하는 등의 작업을 수행합니다.


viewDidDisappear(_:)
설명: 뷰가 화면에서 사라진 후 호출됩니다.
용도: 뷰가 사라진 후 수행할 작업을 정의합니다. 예를 들어, 리소스를 해제하거나 상태를 초기화하는 작업을 할 수 있습니다.

SceneDelegate 


scene(_:willConnectTo:options:)
목적: 새로운 씬이 연결될 때 호출됩니다.
설명: UIWindowScene에 UIWindow를 연결하는 초기 설정을 수행합니다. 스토리보드를 사용할 경우, 이 메소드에서 별도의 초기화 없이 자동으로 연결됩니다.


sceneDidDisconnect(_:)
목적: 씬이 시스템에 의해 해제될 때 호출됩니다.
설명: 씬이 백그라운드로 들어가거나 세션이 버려질 때 호출되어, 해당 씬과 관련된 리소스를 해제할 수 있는 기회를 제공합니다.


sceneDidBecomeActive(_:)
목적: 씬이 비활성 상태에서 활성 상태로 전환될 때 호출됩니다.
설명: 일시 중지된 작업을 재시작하거나, 아직 시작되지 않은 작업을 시작할 수 있는 메소드입니다.


sceneWillResignActive(_:)
목적: 씬이 활성 상태에서 비활성 상태로 전환될 때 호출됩니다.
설명: 전화 통화와 같은 일시적인 방해로 인해 씬이 비활성화되기 전에 필요한 정리 작업을 수행할 수 있습니다.


sceneWillEnterForeground(_:)
목적: 씬이 백그라운드에서 포그라운드로 전환될 때 호출됩니다.
설명: 씬이 백그라운드로 들어가기 전에 변경된 내용을 원래 상태로 되돌릴 수 있는 작업을 수행합니다.


sceneDidEnterBackground(_:)
목적: 씬이 포그라운드에서 백그라운드로 전환될 때 호출됩니다.
설명: 데이터 저장, 리소스 해제 및 씬의 상태 정보를 저장하여 다음 번에 복원할 수 있도록 준비하는 작업을 수행합니다.

 

SceneDelegate 메소드 정리
scene(_:willConnectTo:options:)

목적: 새로운 씬이 연결될 때 호출됩니다.
설명: UIWindowScene에 UIWindow를 연결하는 초기 설정을 수행합니다. 스토리보드를 사용할 경우, 이 메소드에서 별도의 초기화 없이 자동으로 연결됩니다.
sceneDidDisconnect(_:)

목적: 씬이 시스템에 의해 해제될 때 호출됩니다.
설명: 씬이 백그라운드로 들어가거나 세션이 버려질 때 호출되어, 해당 씬과 관련된 리소스를 해제할 수 있는 기회를 제공합니다.
sceneDidBecomeActive(_:)

목적: 씬이 비활성 상태에서 활성 상태로 전환될 때 호출됩니다.
설명: 일시 중지된 작업을 재시작하거나, 아직 시작되지 않은 작업을 시작할 수 있는 메소드입니다.
sceneWillResignActive(_:)

목적: 씬이 활성 상태에서 비활성 상태로 전환될 때 호출됩니다.
설명: 전화 통화와 같은 일시적인 방해로 인해 씬이 비활성화되기 전에 필요한 정리 작업을 수행할 수 있습니다.
sceneWillEnterForeground(_:)

목적: 씬이 백그라운드에서 포그라운드로 전환될 때 호출됩니다.
설명: 씬이 백그라운드로 들어가기 전에 변경된 내용을 원래 상태로 되돌릴 수 있는 작업을 수행합니다.
sceneDidEnterBackground(_:)

목적: 씬이 포그라운드에서 백그라운드로 전환될 때 호출됩니다.
설명: 데이터 저장, 리소스 해제 및 씬의 상태 정보를 저장하여 다음 번에 복원할 수 있도록 준비하는 작업을 수행합니다.

 

UI View 는 보여주기만 하는 요소

사용자에게 반응하는 요소를 컨트롤하려면 UIControl을 사용해야 한다

 

무드등 앱 만들기

import UIKit
import AVFoundation

class ViewController: UIViewController {
    @IBOutlet weak var musicSwitch: UISwitch!
    
    var colorChangeTimer: Timer?
    var audioPlayer: AVAudioPlayer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
        view.addGestureRecognizer(tapGesture)
        
        NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
    }
    
    @objc func applicationWillEnterForeground() {
        startTimerAndMusic()
    }
    
    @objc func handleTapGesture() {
        stopTimerAndMusic()
        colorChangeTimer = nil
        audioPlayer = nil
        
        let alert = UIAlertController(title: "알림", message: "앱을 종료해주세요.", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
        alert.addAction(okAction)
        present(alert, animated: true, completion: nil)
    }
    
    func startTimerAndMusic() {
        // 배경 음악 재생 설정
        if let soundURL = Bundle.main.url(forResource: "bgm", withExtension: "mp3") {
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
                audioPlayer.play()
            } catch {
                print("음악 파일 로드 또는 재생 중 에러 발생: \(error)")
            }
        }
        
        // 1초마다 반복되는 타이머 생성
        colorChangeTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
            // 랜덤한 빨간색, 초록색, 파란색 값을 생성
            let red = CGFloat(arc4random_uniform(256)) / 255.0
            let green = CGFloat(arc4random_uniform(256)) / 255.0
            let blue = CGFloat(arc4random_uniform(256)) / 255.0
            
            // 생성된 랜덤 색상을 사용하여 ViewController의 배경색 설정
            self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
        }
    }
    
    func stopTimerAndMusic() {
        // 타이머와 음악 재생 중지
        colorChangeTimer?.invalidate()
        colorChangeTimer = nil
        audioPlayer.stop()
    }
    
    @IBAction func switchDidChange(_ sender: UISwitch) {
        if sender.isOn {
            startTimerAndMusic()
        }else {
            stopTimerAndMusic()
        }
        
    }
}

요소를 정 가운데 위치시키는 방법

제약 조건 설정

설정하면 이런식으로 제약 조건이 추가됨

 

iOS의 오토 레이아웃(Auto Layout)은 사용자 인터페이스(UI)를 구성할 때 화면 크기와 방향에 따라 자동으로 요소의 위치와 크기를 조정하는 시스템입니다. 즉, 다양한 기기와 화면 크기에 맞춰 레이아웃을 유연하게 관리할 수 있게 해줍니다.

주요 개념
제약 조건(Constraints):
오토 레이아웃은 UI 요소 간의 관계를 정의하는 제약 조건을 사용합니다. 예를 들어, 한 버튼이 다른 버튼의 오른쪽에 위치해야 한다거나, 특정 요소의 너비가 화면의 절반이어야 한다는 등의 조건을 설정할 수 있습니다.


유연성:
오토 레이아웃을 사용하면 다양한 화면 크기와 해상도에 맞춰 요소를 자동으로 조정할 수 있습니다. 예를 들어, iPhone과 iPad에서 동일한 앱을 사용할 때, 화면 크기에 맞춰 UI가 자동으로 조정됩니다.


기기 회전 지원:
화면 회전 시에도 오토 레이아웃은 제약 조건을 기반으로 UI를 자동으로 재배치하여 사용자 경험을 개선합니다.
Interface Builder:

Xcode의 Interface Builder를 사용하면 드래그 앤 드롭 방식으로 쉽게 제약 조건을 설정하고 레이아웃을 디자인할 수 있습니다.
예시
버튼이 화면의 상단 중앙에 위치하도록 하고 싶다면, 다음과 같은 제약 조건을 설정할 수 있습니다:
수직 중앙 정렬
상단에서의 간격 (예: 20 포인트)

스토리보드(Interface Builder) 사용 - 직관적인 UI 구성 가능 📌
- 시각적으로 오토레이아웃을 설정할 수 있어 초보자에게 적합 👀
- Xcode에서 미리보기(Preview) 기능 제공 🎨
- 대규모 프로젝트에서 충돌 발생 가능 ⚠️
- 버전 관리(Git 충돌) 어려움 🛠
- 복잡한 레이아웃 구현 시 제약이 많음 😵
NSLayoutConstraint 코드 작성 - 코드로 레이아웃을 제어할 수 있어 유지보수 용이 💻
- 동적 레이아웃 구현에 적합 🔄
- 코드가 길어질 수 있음 📜
- 직관성이 떨어져 처음 배우기에 어려움 🤯
Visual Format Language (VFL) - 코드량이 적고, 상대적으로 가독성이 좋음 ✍️
- 여러 제약 조건을 한 줄로 표현 가능 ✅
- 문법이 다소 까다롭고 가독성이 떨어질 수 있음 🧐
- 복잡한 UI에서는 가독성이 낮아질 가능성 있음 ⚡
Anchor 기반 오토레이아웃 - 최신 iOS API 지원 📲
- 가독성이 뛰어나고 간결한 코드 작성 가능 🏆
- iOS 9 이상에서만 사용 가능 ⚠️
- 일부 제약조건 설정이 번거로울 수 있음 🔄

 

 

'iOS앱개발' 카테고리의 다른 글

iOS실무 5주차- 맛집 앱 개발(1) Table View  (0) 2025.04.03
iOS 실무 4주차  (0) 2025.03.27
iOS 실무 2주차  (0) 2025.03.13
iOS실무  (0) 2025.03.06
iOS 앱개발 13주  (1) 2024.12.05