iOS/iOS 정리
[iOS] invalidateIntrinsicContentSize()
asong
2022. 4. 5. 15:14
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