본문 바로가기
iOS프로그래밍 실무

[iOS프로그래밍 실무] 3주차

by heeaeeeee 2025. 3. 20.

앱의 기본적인 내용 확인 : [General]탭


번들 ID -> 앱의 이름

 

View Device와 시뮬레이터 동일하게 선택하고 실행

commed + R -> 시뮬레이터

 

viewDidLoad와 viewWillAppear 메서드의 정체

 

App Life Cycle

 

View Life Cycle

 

UIWindow 클래스

 

부모 또는 수퍼뷰(superview)/자식 또는 서브뷰(subview)

 

컨테이너 뷰(Container View)

 

ChatGPT로 무드등 앱 만들기

1. 앱을 실행하면 배경색을 파란색으로 변경

//
//  ViewController.swift
//  NightLight
//
//  Created by 소프트웨어컴퓨터 on 2025/03/20.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.blue
    }
}

 

2. 배경색 임의로 변경

//
//  ViewController.swift
//  NightLight
//
//  Created by 소프트웨어컴퓨터 on 2025/03/20.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let red = CGFloat(arc4random_uniform(256)) / 255.0
        let green = CGFloat(arc4random_uniform(256)) / 255.0
        let blue = CGFloat(arc4random_uniform(256)) / 255.0
        self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
      }
}

 

iOS에서 0부터 225까지 랜덤값을 발생시키는 방법을 많이 사용하는 순서로 모두 알려줘

3. 배경색 1초마다 계속 변경 : 타이머 사용

//
//  ViewController.swift
//  NightLight
//
//  Created by 소프트웨어컴퓨터 on 2025/03/20.
//

import UIKit

class ViewController: UIViewController {
  var colorChangeTimer: Timer?

  override func viewDidLoad() {
    super.viewDidLoad()
    
    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
      self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
    }
  }
  override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    colorChangeTimer?.invalidate()
    colorChangeTimer = nil
  }
}

 

4. 배경 음악 재생 + 20초 후에 자동 종료 기능 구현

배경 음악 추가

//
//  ViewController.swift
//  NightLight
//
//  Created by 소프트웨어컴퓨터 on 2025/03/20.
//

import UIKit

import UIKit
import AVFoundation

class ViewController: UIViewController {
  
  var colorChangeTimer: Timer?
  var audioPlayer: AVAudioPlayer!

  override func viewDidLoad() {
    super.viewDidLoad()
    
    // 배경 음악 재생 설정
    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)
    }
    
    // 1분 후에 앱 종료
    DispatchQueue.main.asyncAfter(deadline: .now() + 60) {
      exit(0)
    }
  }
  
  override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    
    // ViewController가 사라질 때 타이머를 중지하고 nil로 설정하여 메모리 누수를 방지
    colorChangeTimer?.invalidate()
    colorChangeTimer = nil
    
    // 음악 재생 중지
    audioPlayer.stop()
  }
}

 

5. 화면을 탭 하면 alert창으로 앱 종료, 앱 재실행(foreground)시 동일 기능 구현

import UIKit
import AVFoundation

class ViewController: UIViewController {
  
  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()
    
    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()
  }
}

 

6. Switch를 이용하여 배경음악 끄고 배경색 고정

import UIKit
import AVFoundation

class ViewController: UIViewController {
  
  var colorChangeTimer: Timer?
  var audioPlayer: AVAudioPlayer!

    @IBOutlet weak var musicSwitch: UISwitch!
    
    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)
  }
  
    @IBAction func switchDidChange(_ sender: UISwitch) {
        if sender.isOn {
            startTimerAndMusic()
        }else {
            stopTimerAndMusic()
        }
    }
    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()
  }
}

 

 

 

오토레이아웃

iOS에서 유연하고 반응형 UI를 만들기 위한 강력한 도구입니다. 제약 조건을 통해 UI 요소 간의 관계를 정의하여 다양한 화면 크기와 방향에 맞춰 자동으로 조정됩니다. 이를 통해 일관된 사용자 경험을 제공할 수 있습니다.

 

오토레이아웃을 구현하는 4가지 방법의 장단점

방법  장점  단점
1. 스토리보드 사용    
2. Interface Builder (XIB)    
3. 코드에서 NSLayoutConstraint 사용    
4. 스택 뷰 사용    


1. 스토리보드 사용 - 시각적으로 쉽게 레이아웃을 구성 가능<br>- 드래그 앤 드롭으로 간편하게 제약 조건 설정 - 복잡한 레이아웃일 경우 관리가 어려울 수 있음<br>- 동적인 UI 요소에 대한 유연성이 떨어질 수 있음
2. Interface Builder (XIB) - 개별 UI 요소를 독립적으로 관리 가능<br>- 재사용성 높은 UI 구성 가능 - 스토리보드보다 더 많은 파일 관리 필요<br>- 코드와 UI가 분리되어 있어 연동하기 어려울 수 있음
3. 코드에서 NSLayoutConstraint 사용 - 프로그래밍적으로 유연하게 제약 조건 설정 가능<br>- 동적 UI 생성에 적합 - 코드가 길어질 수 있고 가독성이 떨어질 수 있음<br>- 실시간 미리보기가 어려움
4. 스택 뷰 사용 - 요소를 쉽게 수직 또는 수평으로 정렬 가능<br>- 자동으로 크기 조정 및 간격 조정 - 복잡한 레이아웃에는 제약이 있을 수 있음<br>- 성능이 저하될 수 있는 경우가 있음
요약

 

Constraint 설정 툴 : Align, Pin, Resolve, Stack

전광판 앱

iOS 전광판 앱을 만들려고 해 앱스토어에서 많이 다운받는 전광판 앱 일정을 포함한 기획서를 작성해줘

일정표

분담표

 

스토리보드 기반으로 관련 절차와 소스 코드

 

전광판 스토리보드와 소스

import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func displayText(_ sender: UIButton) {
        label.text = textField.text
        startScrolling()
    }
    func startScrolling() {
        UIView.animate(withDuration: 10, delay: 0, options: [.curveLinear, .repeat], animations: {
            self.label.center.x -= self.view.bounds.width
        }, completion: nil)
    }
}

 

0320.zip
6.78MB

 

 

iOS 강의 자료 참고했습니다