Notice
Recent Posts
Recent Comments
Link
study record
[iOS] invalidateIntrinsicContentSize() 본문
IntrinsicContentSize
본질적인 콘텐츠 크기이다. 대부분의 view들은 기본적으로 컨텐츠 크기만큼의 size를 가지고 있다.
UILabel, UIButton은 오토 레이아웃으로 구현할 때 제약사항으로 width와 height를 추가하지 않아도 오류가 나지 않는 이유는 intrinsicContentSize를 가지기 때문이다.
UIView 같은 경우는 IntrinsicContentSize를 가지지 않으며, ImageView,TextView는 컨텐츠에 따라 변화한다.
invalidateIntrinsicContentSize()
- view의 컨텐츠의 크기가 바뀌었을 때 intrinsicContentSize프로퍼티를 통해 size를 갱신하고 그에 맞게 오토레이아웃이 업데이트되도록 만들어주는 메소드이다.
- 즉 view의 content 크기가 바뀔 때 invalidateIntrinsicContentSize를 호출하면 intrinsicContentSize 값이 새로 계산되어 적용된다.
- apple에서 제공해주는 view는 내부적으로 적용이 되어 있다.
- 커스텀 뷰를 구현할 때는 intrinsicContentSize 프로퍼티와 더불어 invalidateIntrinsicContentSize() 메소드 구현이 필요하다.
public var point: CGFloat = 0 {
didSet {
self.currentWidth = getRateToWidth(self.current)
self.maxWidth = getRateToWidth(CGFloat(self.max))
// view의 컨텐츠 크기가 바뀔때 invalidateIntrinsicContentSize() 메소드를 실행
invalidateIntrinsicContentSize()
}
}
public override var intrinsicContentSize: CGSize {
let count = CGFloat(self.max)
var width = self.point * count
width = width + CGFloat(count - 1) * self.spacing
return CGSize(width: width, height: self.point)
}
- 추가적인 상황
테이블뷰에서 셀 아이템들이 추가되고 이 때 셀의 height 값 크기가 동적으로 적용되도록 해야할 때.
- intrinsicContentSize 프로퍼티를 재정의하여 height 값을 재정의한다.
- layoutSubviews 메서드를 재정의한다. 여기에서 invalidateIntrinsicContentSize()를 호출하여 자동으로 크기가 변하도록 적용한다.
final class MyTableView: UITableView {
override var intrinsicContentSize: CGSize {
let height = self.contentSize.height + self.contentInset.top + self.contentInset.bottom
return CGSize(width: self.contentSize.width, height: height)
}
override func layoutSubviews() {
self.invalidateIntrinsicContentSize()
super.layoutSubviews()
}
}
참고:
https://github.com/sujinnaljin/TIL/blob/master/Swift/intrinsicContentSize%20%EC%99%80%20invalidateIntrinsicContentSize().md
https://ios-development.tistory.com/925?category=899471
'iOS > iOS 정리' 카테고리의 다른 글
[iOS] iOS Framework (0) | 2022.07.22 |
---|---|
[iOS] iOS 레이아웃 사이클 (0) | 2022.04.06 |
[iOS] UIView의 Layer란? (0) | 2022.04.01 |
[iOS] UIResponder (0) | 2022.03.30 |
[iOS] NSCache란? (0) | 2022.03.26 |