IntrincContentSize
본질적인 컨텐츠 크기
UILabel, UIButton을 autoLayout으로 구현할 때 Width, Height를 지정해주지 않아도 에러가 발생하지 않는 이유는 IntrinsicContentSize프로퍼티에서 컨텐츠의 크기를 계산해주기 때문입니다.
UILabel, UIButton, UIProgressView 모두 루트뷰의 leading, top spacing만을 주었습니다. 모두 위치만 지정해주고 크기를 지정하지 않았습니다.
UILabel, UIButton은 모두 IntrinsicContentSize프로퍼티가가 Width, Height를 계산해주어서 크기를 정할 수 있지만
UIProgressView는 IntrinsicContentSize로 크기를 알 수 없어서 에러가 발생합니다.
InvalidateIntrinsicContentSize()
view의 크기가 바뀌었을 때 IntrinsicContentSize를 통해 Size를 갱신하고 autoLayout이 업데이트 되도록 하는 메서드입니다.
활용하면 다음처럼 활용할 수 있습니다.
open class IntrinsicContentHeightTableView: UITableView {
open override var contentSize: CGSize {
didSet {
// contentSize가 변경된 경우 invalidateINtrinsicContentSize()를 호출합니다.
invalidateIntrinsicContentSize()
}
}
open override var intrinsicContentSize: CGSize {
// 호출되면 IntrinsicContentSize 프로퍼티를 통해 컨텐츠의 크기를 업데이트합니다.
layoutIfNeeded()
return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
}
}