본문 바로가기
공부/iOS

iOS 프로그래밍 10주차

by Electrohyun 2025. 11. 4.

BMI 판정 앱 만들기


 

 

- Finder에서 왼쪽 사이드바로 폴더를 드래그 하면 메뉴가 추가된다

 

 

- 네비게이터 여닫는 버튼

 

 

- 아웃라인 컨트롤러

 

 

- Attribute Inspector

 

 

- 뭔가 제대로 작동 안하면 Connections Inspector 보기

(시험)

 

 

- 엔트리 포인트(화살표) 가 사라졌다면 런치스크린에서 해당 항목을 체크해주자

 

====

 

업다운 앱 만들기

 

- 초기설정

 

Storyboard 방식과 SwiftUI 방식의 차이

레이블과 두 버튼을 Ctrl 버튼으로 클릭, 에디터까지 이어 각각 연결하기.

IB = Interface Builder

IBLable, IBAction

 

 

- 간단한 앱

 

====

 

 

- Do It 소스(3장)

- 버튼을 Outlet + Action으로 구성! 내부 텍스트의 변화.

- 내부 소스 (출처 Post 하단 기재)

 

//
//  ViewController.swift
//  ImageView
//
//  Created by Ho-Jeong Song on 2021/11/23.
//

import UIKit

class ViewController: UIViewController {
    
    // 현재 이미지가 확대 상태인지 여부를 저장하는 변수
    var isZoom = false
    
    // 켜진 전구 이미지
    var imgOn: UIImage?
    
    // 꺼진 전구 이미지
    var imgOff: UIImage?

    // 이미지가 표시되는 UIImageView 아울렛
    @IBOutlet var imgView: UIImageView!
    
    // 버튼 아울렛 (버튼 라벨을 바꾸기 위해 연결)
    @IBOutlet var btnResize: UIButton!
    
    // 앱 화면이 처음 로드될 때 실행되는 함수 (초기 설정)
    override func viewDidLoad() {
        super.viewDidLoad()

        // 켜진/꺼진 이미지 가져오기
        imgOn = UIImage(named: "lamp_on.png")
        imgOff = UIImage(named: "lamp_off.png")
        
        // 처음엔 켜진 이미지 보여주기
        imgView.image = imgOn
    }

    // [확대/축소] 버튼을 눌렀을 때 실행되는 액션 함수
    @IBAction func btnResizeImage(_ sender: UIButton) {
        // 확대/축소 배율
        let scale: CGFloat = 2.0
        var newWidth: CGFloat, newHeight: CGFloat

        // isZoom == true 면 현재 확대된 상태 → 축소해야 함
        if (isZoom) {
            // 축소 (크기 1/2)
            newWidth = imgView.frame.width / scale
            newHeight = imgView.frame.height / scale
            
            // 버튼 글자를 '확대'로 변경
            btnResize.setTitle("확대", for: .normal)
        }
        else {
            // 확대 (크기 2배)
            newWidth = imgView.frame.width * scale
            newHeight = imgView.frame.height * scale
            
            // 버튼 글자를 '축소'로 변경
            btnResize.setTitle("축소", for: .normal)
        }
        
        // 이미지뷰의 크기 변경
        imgView.frame.size = CGSize(width: newWidth, height: newHeight)
        
        // 상태 반전 (true ↔ false)
        isZoom = !isZoom
    }
    
    // 스위치를 켜거나 끌 때 실행되는 함수
    @IBAction func switchImageOnOff(_ sender: UISwitch) {
        if sender.isOn {
            // 스위치 ON → 켜진 이미지
            imgView.image = imgOn
        } else {
            // 스위치 OFF → 꺼진 이미지
            imgView.image = imgOff
        }
    }
}

 


실습 소스 출처(양질의 소스 감사합니다)

 

 Do it! 스위프트로 아이폰 앱 만들기 입문 개정8판송호정이범근 저 이지스퍼블리싱 2025년 03월 

----------------------------------------
02 Hello World 앱 만들며 Xcode에 완벽 적응하기
03 원하는 이미지 화면에 출력하기 - 이미지 뷰
04 데이트 피커 사용해 날짜 선택하기
05 피커 뷰 사용해 원하는 항목 선택하기
06 얼럿 사용해 경고 표시하기
07 웹 뷰로 간단한 웹 브라우저 만들기
08 맵 뷰로 지도 나타내기
09 페이지 이동하기 - 페이지 컨트롤
10 탭 바 컨트롤러 이용해 여러 개의 뷰 넣기
11 내비게이션 컨트롤러 이용해 화면 전환하기
12 테이블 뷰 컨트롤러 이용해 할 일 목록 만들기
13 음악 재생하고 녹음하기
14 비디오 재생 앱 만들기
15 카메라와 포토 라이브러리에서 미디어 가져오기
16 코어 그래픽스로 화면에 그림 그리기
17 탭과 터치 사용해 스케치 앱 만들기
18 스와이프 제스처 사용하기
19 핀치 제스처 사용해 사진을 확대/축소하기

 

DatePicker

 

//
//  ViewController.swift
//  DatePicker
//
//  Created by Ho-Jeong Song on 2021/11/24.
//

import UIKit

class ViewController: UIViewController {
    // Timer가 호출할 함수 지정 (#selector는 Objective-C 방식 함수 포인터)
    let timeSelector: Selector = #selector(ViewController.updateTime)
    
    // 타이머가 반복될 시간 간격 (1초마다 실행)
    let interval = 1.0
    
    // 테스트용 카운트 변수 (예제 코드에서 주석 처리됨)
    var count = 0

    // 현재 시간을 보여줄 라벨
    @IBOutlet var lblCurrentTime: UILabel!
    
    // 사용자가 DatePicker에서 선택한 시간을 보여줄 라벨
    @IBOutlet var lblPickerTime: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 앱 시작과 동시에 Timer 실행
        // - interval (1초마다)
        // - selector (updateTime 함수 호출)
        // - target (self = 현재 ViewController)
        // - repeats (true = 계속 반복)
        Timer.scheduledTimer(timeInterval: interval,
                             target: self,
                             selector: timeSelector,
                             userInfo: nil,
                             repeats: true)
    }

    // DatePicker 값이 변할 때마다 호출되는 IBAction 함수
    @IBAction func changeDatePicker(_ sender: UIDatePicker) {
        let datePickerView = sender   // 선택된 DatePicker

        let formatter = DateFormatter()     // 날짜 형식 Formatter 생성
        formatter.dateFormat = "yyyy-MM-dd HH:mm EEE" // 년-월-일 시:분 요일 형식

        // DatePicker에 있는 날짜를 지정 포맷으로 문자열 변환
        lblPickerTime.text = "선택시간: " + formatter.string(from: datePickerView.date)
    }

    // Timer가 매초 실행하는 함수 (@objc → Selector로 호출되기 위함)
    @objc func updateTime() {
        // 현재 시간을 가져오기
        let date = NSDate()

        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss EEE" // 초까지 표시 + 요일

        // 현재시간 라벨 갱신
        lblCurrentTime.text = "현재시간: " + formatter.string(from: date as Date)
    }
}

 

5장, 미션2 소스. 각각 부모 클래스, 프로토콜, 프로토콜

 

//
//  ViewController.swift
//  Alert
//
//  Created by BeomGeun Lee on
//

import UIKit

class ViewController: UIViewController {

    // 전구 이미지(켜짐/꺼짐/제거됨)
    let imgOn = UIImage(named: "lamp-on.png")
    let imgOff = UIImage(named: "lamp-off.png")
    let imgRemove = UIImage(named: "lamp-remove.png")
    
    // 현재 전구가 켜져 있는지 상태 저장
    var isLampOn = true
    
    // 전구 이미지를 보여주는 UIImageView
    @IBOutlet var lampImg: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 앱 실행 시 기본 상태: 램프 켜짐
        lampImg.image = imgOn
    }

    // "켜기" 버튼 클릭
    @IBAction func btnLampOn(_ sender: UIButton) {
        // 이미 켜져 있으면 경고창 띄우기
        if isLampOn == true {
            let lampOnAlert = UIAlertController(
                title: "경고",
                message: "현재 On 상태입니다",
                preferredStyle: .alert
            )
            
            let onAction = UIAlertAction(
                title: "네, 알겠습니다.",
                style: .default,
                handler: nil
            )
            lampOnAlert.addAction(onAction)

            // 알림창 표시
            present(lampOnAlert, animated: true, completion: nil)
        } else {
            // 꺼져 있으면 켜기
            lampImg.image = imgOn
            isLampOn = true
        }
    }
    
    // "끄기" 버튼 클릭
    @IBAction func btnLanpOff(_ sender: UIButton) {
        // 켜져 있을 때만 끄는 동작
        if isLampOn {
            let lampOffAlert = UIAlertController(
                title: "램프 끄기",
                message: "램프를 끄시겠습니까?",
                preferredStyle: .alert
            )

            // "네" → 전구 끄기
            let offAction = UIAlertAction(
                title: "네",
                style: .default,
                handler: { action in
                    self.lampImg.image = self.imgOff
                    self.isLampOn = false
                }
            )

            // "아니오" → 취소
            let cancelAction = UIAlertAction(
                title: "아니오",
                style: .default,
                handler: nil
            )

            lampOffAlert.addAction(offAction)
            lampOffAlert.addAction(cancelAction)

            present(lampOffAlert, animated: true, completion: nil)
        }
    }
    
    // "제거" 버튼 클릭
    @IBAction func btnLampRemove(_ sender: UIButton) {
        // 램프 제거 경고창 띄우기
        let lampRemoveAlert = UIAlertController(
            title: "램프 제거",
            message: "램프를 제거하시겠습니까?",
            preferredStyle: .alert
        )

        // "아니오, 끕니다" → 전구 Off
        let offAction = UIAlertAction(
            title: "아니오, 끕니다(off).",
            style: .default,
            handler: { action in
                self.lampImg.image = self.imgOff
                self.isLampOn = false
            }
        )

        // "아니오, 켭니다" → 전구 On
        let onAction = UIAlertAction(
            title: "아니오, 켭니다(on).",
            style: .default
        ) { action in
            self.lampImg.image = self.imgOn
            self.isLampOn = true
        }

        // "네, 제거합니다" → 전구 제거 이미지로 변경
        let removeAction = UIAlertAction(
            title: "네, 제거합니다.",
            style: .destructive   // destructive: 위험/삭제 의미로 빨간색 표시
        ) { action in
            self.lampImg.image = self.imgRemove
            self.isLampOn = false
        }

        // 액션 버튼들 추가
        lampRemoveAlert.addAction(offAction)
        lampRemoveAlert.addAction(onAction)
        lampRemoveAlert.addAction(removeAction)

        // 알림창 표시
        present(lampRemoveAlert, animated: true, completion: nil)
    }
}

- 6장 실습소스, AlertController

 

7장. 웹뷰(Web View)

 

8장. 맵뷰(MapView)

 

- 위경도 정보를 선택하는 곳.

 

세그멘티드 컨트롤

- 버튼 여러 개가 아니라 세그멘티드 컨트롤

 

9장. 페이지컨트롤

 

- 한 화면에서 여러 사진을 보여줄 수 있는 페이지 컨트롤

 

10장. 탭

 

여러 개의 화면을 갖고 있는 경우 탭 바 컨트롤러를 사용한다.

(내부 파일도 ViewController, ImageViewController, DataViewController등 다양하게 구성가능)

 

11장. 네비게이션

 

- 어떤 화면에서 페이지를 왔다 갔다 할 때 ㅅ사용

 

12장. 테이블뷰

 

 

'공부 > iOS' 카테고리의 다른 글

iOS 프로그래밍 12주차  (0) 2025.11.19
iOS 프로그래밍 11주차  (0) 2025.11.11
iOS 프로그래밍 9주차  (0) 2025.10.28
iOS 프로그래밍 7주차  (0) 2025.10.14
iOS 프로그래밍 5주차  (0) 2025.09.30