BMI
앱의 설정을 더 해볼거에요.Auto Layout
→ 기능 구현
→ Tab Bar Controller
Auto Layout
Auto Layout
은 Xcode
에서 iOS
와 macOS
애플리케이션에서 UI
요소들의 위치와 크기를 제어하는 기능이에요.
Auto Layout
란?Auto Layout
은 View
간의 제약 조건을 이용해서 UI
를 구성해요.
이를 통해 화면이 크거나 작은 디바이스에서 UI
요소들이 어떻게 배치될지 자동으로 계산해요.
Auto Layout
은 상대적인 레이아웃을 제공한다는 특징이 있어요.
Layout
이 아무런 제약 없이 존재하는 경우 View
가 겹칠 수 있다는 경고 문구를 나타내요.
아래 그림과 같이 세로 화면을 디자인 했지만 가로 화면으로 회전 시켰을 때 원하는 디자인으로 나타나지 않아요.
Auto Layout
에서 제약 조건은 다음과 같이 있어요.
제약의 종류
Position Constraints
)Size Constraints
)Aspect Ratio Constraints
)우선순위(Priority
)
Required
)Low Priority
)이제 디자인을 이용해서 기능을 구현해볼게요.
다음과 같이 Ctrl
+ 드래그로 설정해줘요.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var lblReult: UILabel!
@IBOutlet weak var txtHeight: UITextField!
@IBOutlet weak var txtWeight: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
연결이 제대로 되어있는지 확인하고 싶은 경우에는 다음과 같이 이동해서 확인할 수 있어요.
View Controller
클릭 → 우측 아이콘 클릭 → 연결 상태 확인
다음과 같이 버튼까지 추가하면 연결은 끝나요.
이전의 연결을 통해 BMI
계산 버튼을 누르면 calcBmi
함수를 실행하도록 설정했어요.
기능 구현의 정확도를 높이기 위해 임의의 값을 지정하고 주요 기능만 먼저 구현해요.
@IBAction func calcBmi(_ sender: UIButton) {
let weight = 60.0
let height = 170.0
let bmi = weight / (height * height * 0.0001) // kg/m²
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)")
}
실행 후에 버튼을 눌렀을 때 콘솔 창에 정상적으로 값이 출력되는지 확인해요.
정상적으로 출력되었다면 이제 값을 입력 받아서 출력하도록 코드를 수정해요.
만약 다음과 같이 코드를 작성한다면 주의할 점이 있어요.
let height = Double(txtHeight.text!)!
let weight = Double(txtWeight.text!)!
느낌표(!
)를 통한 강제 언래핑을 하는 경우 느낌표가 2번 사용되는 것이 정상적이에요.
그 이유는 txtHeight.text
는 String?
형으로 옵셔널이에요.
옵셔널을 느낌표를 통해 강제 언래핑한 상태에요.
Double(...)!
의 경우 문자열을 Double
형으로 형변환하고 있기 때문에 Swift
에서는 실패하는 경우를 대비하고 있어요.
바로 옵셔널로 반환하는 것이죠.
때문에 형변환을 하는 경우에도 옵셔널을 언래핑해줘야 해요.
따라서 입력받은 값의 언래핑과 형변환의 언래핑으로 총 두 번의 느낌표를 사용해야 컴파일 시 에러가 발생하지 않아요.
이제 입력 받은 값을 계산할 수 있도록 수정할거에요.
주의할 점은 아무 값도 입력하지 않고 버튼을 누르는 경우 에러가 발생할 수 있기 때문에 따로 처리해야 해요.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var lblReult: UILabel!
@IBOutlet weak var txtHeight: UITextField!
@IBOutlet weak var txtWeight: UITextField!
@IBAction func calcBmi(_ sender: UIButton) {
if txtHeight.text == "" || txtWeight.text == "" {
lblReult.textColor = .red
lblReult.text = "키와 체중을 입력하세요!"
return
} else {
let weight = 60.0
let height = 170.0
let bmi = weight / (height * height * 0.0001) // kg/m²
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)")
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
이제 값을 입력해서 정상적으로 실행되는지 확인해요.
이제 입력된 값에 따라서 다양한 결과 디자인을 나타내도록 해볼게요.
colorUI
를 통해 색을 지정하고 라벨의 backgroundColor
를 통해 적용할 수 있어요.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var lblReult: UILabel!
@IBOutlet weak var txtHeight: UITextField!
@IBOutlet weak var txtWeight: UITextField!
@IBAction func calcBmi(_ sender: UIButton) {
if txtHeight.text == "" || txtWeight.text == "" {
lblReult.textColor = .red
lblReult.text = "키와 체중을 입력하세요!"
return
} else {
let weight = 60.0
let height = 170.0
let bmi = weight / (height * height * 0.0001) // kg/m²
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: 0.0, blue: 1.0, alpha: 1.0)
body = "정상"
} else {
color = UIColor(displayP3Red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
body = "저체중"
}
lblReult.backgroundColor = color
lblReult.layer.cornerRadius = 10
lblReult.clipsToBounds = true
lblReult.text = "BMI: \(shortenedBmi), 판정: \(body)"
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
이제 입력 값에 따라서 출력 화면이 다르게 나타나도록 해줬어요.
Tab Bar Controller
Tab Bar Controller
는 앱에서 여러 개의 화면을 탭 형태로 전환할 수 있게 해줘요. 탭 바를 표시해서 사용자가 각 탭을 선택하여 다른 화면을 쉽게 탐색할 수 있도록 해요.
다음과 같이 View
를 선택 후 화면 상단 Editor
- Embed in
- Tab Bar Controller
를 통해 추가해줄 수 있어요.
그러면 다음과 같이 화면이 2개로 늘어난 것을 확인할 수 있고 좌측에 더 많은 요소가 생겨난 것을 확인할 수 있어요.
생성된 화면에서 좌측의 별 모양 아이콘을 선택하고 우측 창에서 Title
을 변경 해주면 탭 바의 제목을 지정해줄 수 있어요.
또한 우측의 Selected Image
를 통해서 탭 바에 나타나는 아이콘을 설정해줄 수 있어요.
기존 화면에서 Shift
+ Commend
+ L
키를 통해 View Controller
를 드래그해서 추가해줘요.
그 다음 기존 화면을 클릭 후 Ctrl
+ 드래그를 통해 새로 만든 화면에 드래그해주면 다음과 같이 나타나요.
드래그 시 나타나는 화면에서 view controllers
를 선택해주면 다음과 같이 여러 탭을 선택해서 적용할 수 있어요.
똑같이 이름과 아이콘을 지정해주고 실행하면 정상적으로 탭 전환이 가능한 것을 알 수 있어요.
Xcode
의 ColorUI
에 대해 알고 값에 따라 다르게 나타냈어요.