[iOS/UIKit] UIKit 란 무엇일까
https://developer.apple.com/documentation/uikit/
UIKit | Apple Developer Documentation
Construct and manage a graphical, event-driven user interface for your iOS, iPadOS, or tvOS app.
developer.apple.com
UIKit은 iOS, iPadOS 또는 tvOS 앱의 핵심 인프라를 구성하는 데 사용할 수 있는 구성 요소를 포함하여 앱을 빌드하는 데 필요한 다양한 기능을 제공합니다. 이 프레임워크는 UI를 구현하기 위한 창 및 뷰 아키텍처, 앱에 Multi-Touch 및 기타 유형의 입력을 제공하기 위한 이벤트 처리 인프라, 사용자, 시스템 및 앱 간의 상호 작용을 관리하기 위한 기본 실행 루프를 제공합니다.
특징
- iOS 2.0 이상 지원
- 이벤트 중심
- 상속 기반
- storyBoard 지원
UIKit는 SwfftUI 프레임워크랑 완벽하게 호환되어 UKIit 일부 기능을 SwiftUI에 구현하거나 인터페이스를 혼합할 수 있다.
마찬가지로 SwiftUI를 UIKit 뷰 내부에 배치할수도 있다.
UIKit 앱 코드 구조
UIKit은 시스템과 상호 작용하고, 앱의 메인 이벤트 루프를 실행하고, 콘텐츠를 화면에 표시하는 것을 포함하여 앱의 핵심 객체 중 많은 것을 제공합니다. 이러한 객체의 대부분을 그대로 사용하거나 약간만 수정하여 사용합니다. 어떤 객체를 수정해야 하는지, 언제 수정해야 하는지 아는 것은 앱을 구현하는 데 중요합니다. UIKit 앱의 구조는 모델-뷰-컨트롤러(MVC) 디자인 패턴을 기반으로 하며, 여기서 객체는 목적에 따라 구분됩니다. 모델 객체는 앱의 데이터와 비즈니스 로직을 관리합니다. 뷰 객체는 데이터의 시각적 표현을 제공합니다. 컨트롤러 객체는 모델과 뷰 객체 간의 브리지 역할을 하며 적절한 시기에 두 객체 간에 데이터를 이동합니다.
MVC 패턴이란?
- Model: 데이터와 비즈니스 로직을 담당한다. 앱의 상태를 표현하고, 데이터를 관리하며, 데이터를 가공하는 로직이 포함한다. 예를 들어, 사용자 프로필 정보나 서버에서 받아온 데이터 등이 모델에 해당한다..
- View: 사용자 인터페이스(UI)를 담당합니다. 데이터를 화면에 표시하고, 사용자와 상호작용하는 요소들을 포함한다. UIView와 이를 상속받은 다양한 UI 요소들이 여기에 해당된다.
- Controller: View와 Model 사이에서 중개 역할을 한다. 뷰와 모델의 상호작용을 관리하며, 사용자 입력에 따라 모델을 업데이트하고, 변경된 모델 데이터를 뷰에 반영하고 UIViewController가 이 역할을 수행한다.
UIKit 구조
하나하나 알아보자
UIApplication
앱의 생명주기를 관리하는 객체다.
앱이 시작될 때 UIApplication 객체가 생성되며 이 객체로 앱의 주요 이벤트를 관리한다.
AppDelegate
앱의 상태 변화에 응답하는 메서드를 정의하는 곳이다.
UIApplicationDelegate 프로토콜을 준수하고 앱의 초기 설정, 푸시 알림 처리, 상태 변화에 따른 작업을 담당한다.
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 앱 초기화 코드
return true
}
func applicationDidEnterBackground(_ application: UIApplication) {
// 앱이 백그라운드로 진입했을 때 실행되는 코드
}
func applicationWillTerminate(_ application: UIApplication) {
// 앱이 종료될 때 실행되는 코드
}
}
UIWindow
앱의 컨텐츠를 보여주는 창이다.
화면에 뷰 컨트롤러를 표시하는 역항을 하며 앱의 루트 뷰 컨트롤러를 관리한다.
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = YourRootViewController()
window?.makeKeyAndVisible()
UIViewController
화면의 한 단위를 관리하는 객체다.
하나의 화면은 하나의 UIViewController에 의해 관리되며 뷰 컨트롤러는 사용자 인터페이스의 생명주기를 관리하고 뷰와 모델 간의 상호작용을 조율한다.
UIViewController의 생명주기
- loadView(): 뷰 컨트롤러의 뷰를 메모리에 로드할 때 호출됩니다. 보통 커스텀 뷰를 설정하려면 이 메서드를 재정의한다..
- viewDidLoad(): 뷰 컨트롤러의 뷰가 메모리에 로드된 직후 호출됩니다. 초기 설정 및 데이터 로딩을 수행하는 데 사용한다.
- viewWillAppear(): 뷰가 화면에 나타나기 직전에 호출된다.
- viewDidAppear(): 뷰가 화면에 완전히 나타난 후 호출된다.
- viewWillDisappear(): 뷰가 화면에서 사라지기 직전에 호출된다.
- viewDidDisappear(): 뷰가 화면에서 완전히 사라진 후 호출된다.
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 초기 설정 및 뷰 구성
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 뷰가 화면에 나타나기 전에 수행할 작업
}
}
UIView
화면의 기본 구성요소
모든 UI 요소는 UIView를 상속받아 만들어진다.
class MyCustomView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
// 커스텀 뷰 설정
}
required init?(coder: NSCoder) {
super.init(coder: coder)
// 커스텀 뷰 설정
}
}
UIView의 생명주기
- init(frame:): 코드로 뷰를 생성할 때 호출됩니다.
- init?(coder:): 인터페이스 빌더에서 뷰를 생성할 때 호출됩니다.
- layoutSubviews(): 뷰의 서브뷰를 레이아웃할 때 호출됩니다.
- draw(_:): 뷰가 그려질 때 호출됩니다. 커스텀 드로잉 작업을 이 메서드에서 처리합니다.
UINavigationController
계층적 탐색 구조를 관리하는 컨트롤러.
화면 간의 전환을 관리하며 상단의 네비게이션 바를 통해 이전 화면으로 돌아가는 기능을 제공한다.
- pushViewController(_:animated:): 새로운 화면을 네비게이션 스택에 추가한다.
- popViewController(animated:): 현재 화면을 네비게이션 스택에서 제거하고, 이전 화면으로 돌아간다.
let navigationController = UINavigationController(rootViewController: HomeViewController())
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
UIKit에서의 이벤트 처리
1. Target-Action 패턴
버튼 클릭 같은 이벤트를 처리한다.
let button = UIButton(type: .system)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
@objc func buttonTapped() {
print("Button was tapped!")
}
2, Gesture Recognizers
탭 스와이프 핀치를 처리할 수 있다.
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
view.addGestureRecognizer(tapGesture)
@objc func handleTap(_ sender: UITapGestureRecognizer) {
print("View was tapped!")
}
추후 포스팅에서는 UIKit를 활용해서 앱을 만들어볼 것이다.