본문 바로가기

iOS

iOS_week12

bmi계산기 다시 만듦

rounded button : identity inspector

- 버튼 선택한 후 Identity Inspector 클릭 

- User Defined Runtime Attributes에서 [+]클릭

- Key Path : layer.cornerRadius, Type: Number, Value : 7 입력 ->시험에 자주 출제

 

Textfield의 keyboard type

view controller 선택 후 connection insepctor 확인

//
//  ViewController.swift
//  B_BMIYOO
//
//  Created by comsoft on 2025/11/17.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var txtHeight: UITextField!
    @IBOutlet weak var txtWeight: UITextField!
    
    @IBOutlet weak var lblResult1: UILabel!
    
    @IBAction func calcbtn(_ sender: UIButton) {
        let height = Double(txtHeight.text!)! //과제
        let weight = Double(txtWeight.text!)!
        print(height,weight)
        let bmi = weight/(height*height*0.0001)
        let shortenedBmi = String(format: "%.1f", bmi)
        var body = ""
        if bmi >= 40 {
        body = "3단계 비만"
        } else if bmi >= 30 && bmi < 40 {
        body = "2단계 비만"
        } else if bmi >= 25 && bmi < 30 {
        body = "1단계 비만"
        } else if bmi >= 18.5 && bmi < 25 {
        body = "정상"
        } else {
        body = "저체중"
        }
        print("BMI:\(shortenedBmi), 판정:\(body)")
        lblResult1.text="BMI: \(shortenedBmi),  판정: \(body)"
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

 

textfield로 들어오는 텍스트는 모두 문자열.

- let height = Double(txtHeight.text!)!

- let weight = Double(txtWeight.text!)!



- Double 구조체를 사용하여 형을 바꾼 후 강제 언래핑을 한 이유.

왜 옵셔널 형으로 나오는가? 

Double(12) => 12.0

Double 구조체를 사용하여 문자열 text를 double 형으로 변경

Double("12") => Optional(12)

Double("hi") => nil

문자열을 변경할 경우 숫자로 바꿀 수 없는 경우도 있을 수 있기 때문에 옵셔널형으로 반환.

==> txtHeight.text! 로 반환한 값이 문자열임. 문자열을 double형으로 바꾸기 때문에 옵셔널 언래핑을 해야함.

 

text는 옵셔널 스트링형 값이 없을수도 있음.

 

.text로 입력된 값을 문자열로 바꿀 경우에도 옵셔널로 반환 - 입력한 값이 없을수도 있기 때문.

 

but. 강제 언래핑이기 때문에 입력한 값이 없을 경우에 crash 발생하는 치명적인 오류 발생 가능

 

// 변경한 완성된 코드
//  ViewController.swift
//  B_BMIYOO
//
//  Created by comsoft on 2025/11/17.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var txtHeight: UITextField!
    @IBOutlet weak var txtWeight: UITextField!
    
    @IBOutlet weak var lblResult1: UILabel!
    
    @IBAction func calcbtn(_ sender: UIButton) {
        if txtHeight.text == "" || txtWeight.text == "" {
            lblResult1.textColor = .red
            lblResult1.backgroundColor = .blue
            lblResult1.text = "키와 몸무게를 입력하세요!"
            return
        }else{
            let height = Double(txtHeight.text!)! // text가 없을 경우의 문제는 해결
            // 원래는 Double()! 이것도 문제가 발생할 수 있기에 옵셔널 바인딩이나 guard~ let 을 
            사용하는게 좋음. but 우리는 키보드가 decimal keyboard라 항상 숫자만 문자열로 받음
            -> 강제언래핑을 해도 크래쉬 발생하지않음. 키보드를 잘 선택하는것도 중요하다.
            let weight = Double(txtWeight.text!)!
            print(txtHeight.text!,txtWeight.text!)
            let bmi = weight/(height*height*0.0001)
            let shortenedBmi = String(format: "%.1f", bmi)
            var body = ""
            if bmi >= 40 {
                body = "3단계 비만"
            } else if bmi >= 30 && bmi < 40 {
                body = "2단계 비만"
            } else if bmi >= 25 && bmi < 30 {
                body = "1단계 비만"
            } else if bmi >= 18.5 && bmi < 25 {
                body = "정상"
            } else {
                body = "저체중"
            }
            print("BMI:\(shortenedBmi), 판정:\(body)")
            lblResult1.textColor = .white
            lblResult1.text="BMI: \(shortenedBmi),  판정: \(body)"
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

apple 에서는 색깔을 0 에서 1.0 사이로 표시.

alpha는 투명도

//
//  ViewController.swift
//  B_BMIYOO
//
//  Created by comsoft on 2025/11/17.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var txtHeight: UITextField!
    @IBOutlet weak var txtWeight: UITextField!
    
    @IBOutlet weak var lblResult1: UILabel!
    
    @IBAction func calcbtn(_ sender: UIButton) {
        if txtHeight.text == "" || txtWeight.text == "" {
            lblResult1.textColor = .black
            lblResult1.backgroundColor = .red
            lblResult1.text = "키와 몸무게를 입력하세요!"
            return
        }else{
            let height = Double(txtHeight.text!)! //과제
            let weight = Double(txtWeight.text!)!
            //print(txtHeight.text!,txtWeight.text!)
            let bmi = weight/(height*height*0.0001)
            let shortenedBmi = String(format: "%.1f", bmi)
            var body = ""
            var color = UIColor.white
            if bmi >= 40 {
                color = UIColor(displayP3Red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
                body = "3단계 비만"
            } else if bmi >= 30 && bmi < 40 {
                color = UIColor(displayP3Red: 0.7, green: 0.0, blue: 0.0, alpha: 1.0)
                body = "2단계 비만"
            } else if bmi >= 25 && bmi < 30 {
                color = UIColor(displayP3Red: 0.4, green: 0.0, blue: 0.0, alpha: 1.0)
                body = "1단계 비만"
            } else if bmi >= 18.5 && bmi < 25 {
                color = UIColor(displayP3Red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
                body = "정상"
            } else {
                color = UIColor(displayP3Red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
                body = "저체중"
            }
            //print("BMI:\(shortenedBmi), 판정:\(body)")
            lblResult1.textColor = .white
            lblResult1.backgroundColor = color
            lblResult1.clipsToBounds = true
            lblResult1.layer.cornerRadius = 10
            lblResult1.text="BMI: \(shortenedBmi),  판정: \(body)"
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

 

코드를 이용해서 label의 테두리 둥글게.

z order 를 변경하고 alpha값을 낮춰서 은은하게 보이도록.

z order 는 드래그해서 위쪽으로 보내야함. 밑에 있을수록 우선순위 높음

 

세그먼트 컨트롤의 인덱스: 기본적으로 두개가 나옴. 0부터 시작

 

// gpt refactoring 코드
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var txtHeight: UITextField!
    @IBOutlet weak var txtWeight: UITextField!
    @IBOutlet weak var lblResult1: UILabel!

    @IBAction func calcbtn(_ sender: UIButton) {
        guard let heightText = txtHeight.text,
              let weightText = txtWeight.text,
              let height = Double(heightText),
              let weight = Double(weightText),
              !heightText.isEmpty, !weightText.isEmpty else {
            
            updateResultLabel(
                text: "키와 몸무게를 입력하세요!",
                color: .red,
                textColor: .black
            )
            return
        }
        
        let bmi = calculateBMI(height: height, weight: weight)
        let bmiString = String(format: "%.1f", bmi)
        let (bodyType, bgColor) = judgeBMI(bmi)

        updateResultLabel(
            text: "BMI: \(bmiString),  판정: \(bodyType)",
            color: bgColor,
            textColor: .white
        )
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

// MARK: - BMI 계산 / 판정 / UI 업데이트 기능 분리
extension ViewController {

    /// BMI 계산 함수
    func calculateBMI(height: Double, weight: Double) -> Double {
        return weight / (height * height * 0.0001)
    }

    /// BMI 판정 함수
    func judgeBMI(_ bmi: Double) -> (String, UIColor) {
        switch bmi {
        case 40...:
            return ("3단계 비만", UIColor(red: 1, green: 0, blue: 0, alpha: 1))
        case 30..<40:
            return ("2단계 비만", UIColor(red: 0.7, green: 0, blue: 0, alpha: 1))
        case 25..<30:
            return ("1단계 비만", UIColor(red: 0.4, green: 0, blue: 0, alpha: 1))
        case 18.5..<25:
            return ("정상", UIColor(red: 0, green: 1, blue: 0, alpha: 1))
        default:
            return ("저체중", UIColor(red: 0, green: 0, blue: 1, alpha: 1))
        }
    }

    /// UI Label 업데이트 함수
    func updateResultLabel(text: String, color: UIColor, textColor: UIColor) {
        lblResult1.text = text
        lblResult1.backgroundColor = color
        lblResult1.textColor = textColor
        lblResult1.clipsToBounds = true
        lblResult1.layer.cornerRadius = 10
    }
}

Tab Bar Controller 를 붙이면 기존에 있던 scene 이 Item Scene 으로 변경

 

BMI로 변경

video controller 를 추가하고 Tab Bar 와  연결하면 segue 생김. 항상 item controller 로 변경됨

 

video controller 생성하고 identity inspector 확인.

기존에 작성한 코드는 viewController 클래스.

video controller 를 사용하기 위해서 새로 클래스를 작성해야함.

 

Add to targets 반드시 체크해야함. 체크하지 않으면 Xcode가 못찾음

시험에 출제 -> identity inspector 에서 Class 연결

새로운 화면을 만들고 이를 Swift에서 실행하기 위해서는 identity inspector에서 반드시 연결을 해줘야함

-> 연결 안하면 오류는 안나지만 실행 안됨

 

//
//  VideoViewController.swift
//  B_BMIYOO
//
//  Created by comsoft on 2025/11/17.
//
//gpt에 물어본 VideoViewController 비디오 재생하는 코드

import UIKit
import AVKit

class VideoViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    @IBAction func playVideo(_ sender: UIButton) {
        if let path = Bundle.main.path(forResource: "bmi", ofType: "mp4") {
                let url = URL(fileURLWithPath: path)
                
                let player = AVPlayer(url: url)
                let playerVC = AVPlayerViewController()
                playerVC.player = player
                
                present(playerVC, animated: true) {
                    player.play()
                }
            }
    }
    

}

 

 

AVkit import 해야함.

//
//  VideoViewController.swift
//  B_BMIYOO
//
//  Created by comsoft on 2025/11/17.
//

import UIKit
import AVKit

class VideoViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    @IBAction func playVideo(_ sender: UIButton) {
        let videoPath: String? = Bundle.main.path(forResource: "bmi", ofType: "mp4")
        let videoURL = URL(filePath: videoPath!) //강제 언래핑. 이를 보완한 것이 위의 코드
        let player = AVPlayer(url:videoURL)
        let playerController = AVPlayerViewController()
        playerController.player = player
        present(playerController, animated: true)
        player.play()
    }
    

}

10주차 pdf 71.p 까지의 내용

'iOS' 카테고리의 다른 글

iOS_프로젝트  (1) 2025.12.08
iOS_week13  (1) 2025.11.24
iOS_week10  (0) 2025.11.03
iOS_week9  (0) 2025.10.27
iOS_week6  (0) 2025.10.13