IntrinsicContentSize를 이용한 Dynamic Height

IntrinsicContentSize 란 ?

  1. 애플 도큐먼트를 보면 '뷰 자체의 본질적 크기' 라고 나와 있다.

  2. Label 혹은 Button 레이아웃을 잡을 때 width 나 height를 따로 설정해주지 않아도 알아서 레이아웃이 잡혀 나오는 이유가 바로 IntrinsicContentSize를 가지고 있기 때문이라고 한다.

  3. View를 Custom하게될 경우 이미 정해진 IntrinsicContentSize와 다르게 size를 갱신시켜야 하기 때문에, invalidateIntrinsicContentSize() 메서드를 통해 커스텀된 뷰에 따라 레이아웃이 바뀌도록 해야 한다.

DynamicHeight CollectionView

셀의 크기나 셀의 개수에 따라 셀을 포함하고 있는 CollectionView의 Height을 동적으로 대응하기 위한 코드

class DynamicHeightCollectionView: UICollectionView {
    override func layoutSubviews() {
        super.layoutSubviews()
        if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
            self.invalidateIntrinsicContentSize()
        }
    }
    
    override var intrinsicContentSize: CGSize {
        return contentSize
    }
}

layoutSubviews() 가 호출되는 시점 : reloadData() 발생 후 cell의 개수를 결정하고, dequeueReusableCell를 통해 보여질 cell를 모두 생성한 뒤 호출됨
-> 즉 얼만큼 CollectionView의 height가 동적으로 대응되어야할지 정해진 후 !

layoutSubviews()를 오버라이딩 하면 cell이 모두 결정된 후 collectionView height을 어떻게 조절해줄 것인지 정할 수 있겠죠 ?

cell을 통해 정해진 collectionView bounds size와 intrinsicContentSize를 비교하여 둘이 다를 경우 invalidateIntrinsicContentSize()를 통해 달라진 사이즈를 갱신시킵니다!

어떤 사이즈로 갱신시킬 것인지 intrinsicContentSize를 오버라이딩 하여 길어진 contentSize를 리턴하면, 동적으로 높이를 변경할 수 있습니다.

좋은 웹페이지 즐겨찾기