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 |