intrinsicContentSize는 UIView나 UIControl과 같은 뷰 계층 구조에서, 뷰의 내용(content)에 맞추어 뷰가 적절한 크기를 계산하는데 사용되는 속성(property)입니다.
예를 들어, UILabel은 텍스트의 길이와 폰트, 줄 간격 등에 따라 높이와 너비가 결정됩니다. 이때, UILabel은 내용에 맞는 적절한 크기를 계산하기 위해 intrinsicContentSize를 사용합니다.
intrinsicContentSize는 UIView의 크기가 자동으로 결정될 때 사용됩니다. 예를 들어, 스토리보드에서 뷰의 크기를 지정하지 않고, 내용에 맞게 크기를 자동으로 조정하고 싶을 때 intrinsicContentSize를 구현해야 합니다. 또한, Auto Layout을 사용하는 경우 intrinsicContentSize를 구현하면 뷰의 크기를 쉽게 조정할 수 있습니다.
*** Auto Layout ***
Auto Layout은 iOS 및 macOS 애플리케이션에서 UI 요소의 크기와 위치를 지정하기 위한 시각적 레이아웃 구성 도구입니다. Auto Layout은 여러 디바이스에서 일관된 사용자 경험을 제공하기 위해 다양한 크기와 해상도의 스크린을 지원합니다.
Auto Layout은 제약 조건(constraints)을 사용하여 UI 요소의 크기 및 위치를 정의합니다. 각 요소는 x, y 좌표와 너비, 높이 등의 속성으로 구성된 위치 정보를 갖고 있으며, 각각의 요소에 대한 제약 조건은 해당 속성들을 어떻게 배치할 것인지를 결정합니다.
제약 조건은 일반적으로 뷰 계층 구조의 부모 뷰와 자식 뷰 사이에 정의됩니다. 부모 뷰는 자식 뷰가 뷰 계층에서 차지하는 영역을 제한하고, 자식 뷰는 부모 뷰 내에서 위치 및 크기를 조절하여 원하는 디자인을 만듭니다.
Auto Layout을 사용하면 스토리보드 또는 코드로 제약 조건을 만들 수 있습니다. Xcode의 Interface Builder에서는 뷰의 레이아웃을 직접 조작하여 제약 조건을 만들 수 있습니다. 또한 코드로 제약 조건을 만들 수도 있습니다. 이를 통해 디바이스의 크기나 방향 변경에 따라 자동으로 레이아웃이 조정되도록 할 수 있습니다.
import UIKit
class IntrinsicContentSizeExampleViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// MyCustomView 인스턴스 생성 및 설정
let myCustomView = MyCustomView()
myCustomView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(myCustomView)
// MyCustomView를 뷰의 중앙에 위치하도록 제약조건 추가
// leading, trailing, top, bottom 여백 조건 추가
// width, height 크기 조건 추가
NSLayoutConstraint.activate([
myCustomView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
myCustomView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
myCustomView.leadingAnchor.constraint(greaterThanOrEqualTo: view.leadingAnchor, constant: 20),
myCustomView.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -20),
myCustomView.topAnchor.constraint(greaterThanOrEqualTo: view.topAnchor, constant: 20),
myCustomView.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor, constant: -20),
myCustomView.widthAnchor.constraint(lessThanOrEqualToConstant: 300),
myCustomView.heightAnchor.constraint(lessThanOrEqualToConstant: 500)
])
}
}
class MyCustomView: UIView {
// MyCustomView 내부에 포함될 UILabel 인스턴스 생성
private let label = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
// UILabel 인스턴스 초기 설정
label.numberOfLines = 0
label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
self.addSubview(label)
// UILabel 인스턴스의 Auto Layout 제약조건 설정
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.leadingAnchor.constraint(equalTo: leadingAnchor),
label.trailingAnchor.constraint(equalTo: trailingAnchor),
label.topAnchor.constraint(equalTo: topAnchor),
label.bottomAnchor.constraint(equalTo: bottomAnchor),
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// intrinsicContentSize 계산
override var intrinsicContentSize: CGSize {
let size = label.intrinsicContentSize
return CGSize(width: size.width, height: size.height)
}
}
intrinsicContentSize적용 전
intrinsicContentSize적용 후
'iOS' 카테고리의 다른 글
REST API (0) | 2023.04.13 |
---|---|
Content hugging과 Compression resistance (0) | 2023.04.12 |
(iOS) Chat GPT 사용해보기 (0) | 2023.04.12 |
컬렉션 뷰에서 데이터를 사용할 때 struct?, class? (0) | 2023.04.11 |
Static dispatch, Dynamic dispatch (0) | 2023.04.11 |