import UIKit
class CustomView: UIView {
// 이곳에서 뷰의 속성을 설정하거나 추가적인 코드를 작성할 수 있습니다.
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupView()
}
private func setupView() {
// 뷰의 기본 설정을 수행합니다.
// 배경색 설정
backgroundColor = UIColor.blue
// 프레임 설정 (크기와 위치)
frame = CGRect(x: 0, y: 0, width: 200, height: 100)
// 텍스트 레이블 추가
let label = UILabel(frame: CGRect(x: 10, y: 10, width: 180, height: 80))
label.text = "Hello, Custom View!"
label.textColor = UIColor.white
label.textAlignment = .center
addSubview(label)
}
}
// 뷰 컨트롤러에서 CustomView를 사용하는 예제
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// CustomView 인스턴스 생성
let customView = CustomView()
// 뷰 컨트롤러의 뷰에 추가
view.addSubview(customView)
}
}
Q. 왜 두 생성자에서 모두 초기화 해야 돼? 한번만 하면 안돼?
init(frame:) - 코드로 생성
이 생성자는 코드에서 CustomView를 직접 생성할 때 호출됩니다.
이 경우, frame 매개변수에 따라 뷰의 초기 프레임을 설정할 수 있습니다.
init?(coder:) - Interface Builder로 로드
이 생성자는 Interface Builder에서 스토리보드 또는 xib 파일을 통해 CustomView를 로드할 때 호출됩니다.
Interface Builder는 뷰를 인코딩하고 디코딩하기 위해 NSCoder를 사용하는데, 이 생성자는 그 과정에서 호출됩니다.
두 가지 시나리오를 모두 지원하기 위해 두 생성자를 모두 구현하는 것이 일반적입니다.
그렇지 않으면 코드로만 뷰를 생성하거나 Interface Builder로만 뷰를 로드하는 경우에 문제가 발생할 수 있습니다.
중복 초기화되는 것을 방지하기 위해 아래와 같은 방법으로도 사용한다고 한다.
import UIKit
class CustomView: UIView {
private var isSetup = false
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
guard !isSetup else { return }
setupView()
isSetup = true
}
private func setupView() {
// 뷰의 기본 설정을 수행합니다.
// 배경색 설정
backgroundColor = UIColor.blue
// 프레임 설정 (크기와 위치)
frame = CGRect(x: 0, y: 0, width: 200, height: 100)
// 텍스트 레이블 추가
let label = UILabel(frame: CGRect(x: 10, y: 10, width: 180, height: 80))
label.text = "Hello, Custom View!"
label.textColor = UIColor.white
label.textAlignment = .center
addSubview(label)
}
}
// 뷰 컨트롤러에서 CustomView를 사용하는 예제
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// CustomView 인스턴스 생성
let customView = CustomView()
// 뷰 컨트롤러의 뷰에 추가
view.addSubview(customView)
}
}
'iOS > Study' 카테고리의 다른 글
[ChatGPT 검색] LazyVStack을 만들 때 뷰가 몇개까지 미리 만들어지는지 알아? (0) | 2024.05.12 |
---|---|
[ChatGPT 검색] NSMutableURLRequest vs NSURLRequest (0) | 2024.04.17 |
REST API (0) | 2024.03.26 |
[ChatGPT 검색] Driver vs Relay (0) | 2024.02.27 |
SwiftUI 를 공부하면서 (3) | 2023.11.30 |