앱의 기본적인 내용 확인 : [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)
}
}
'iOS프로그래밍 실무' 카테고리의 다른 글
[iOS프로그래밍 실무] 6주차 (0) | 2025.04.10 |
---|---|
[iOS프로그래밍 실무] 5주차 (0) | 2025.04.03 |
[iOS프로그래밍 실무] 4주차 (0) | 2025.03.27 |
[iOS프로그래밍 실무] 2주차 (0) | 2025.03.19 |
[iOS프로그래밍 실무] 1주차 (0) | 2025.03.06 |