[iOS] Collection View Cell 크기를 컨텐츠에 따라 바뀌게 하기

SeonDal·2021년 12월 23일
0

나는 이렇게 생긴 컬렉션 뷰를 만들고싶다.

세로 길이는 일정하고, 가로 길이는 컨텐츠의 길이에 따라 정해져있는
텍스트라벨로만 이루어진 스크롤뷰



컬렉션 뷰 셀 크기 지정

컬렉션 뷰 셀의 크기는 extension의 sizeForItemAt 에서 지정 가능하다.

extension HomeVC: UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

                return CGSize(width: 70, height: 35)
                
        }
    }
    ...


다만 문제는

컬렉션 뷰가 만들어질 때

  1. extension적용으로 셀 크기 할당
  2. 적용된 셀에 컨텐츠 추가 (글씨에 해당)

이 순서로 진행되기 떄문에

셀 크기를 할당하는 시점에서는 해당 셀에 어떤 내용이 들어갈지 모른다 -> 따라서 크기를 미리 지정하는것이 불가능하다

그렇다고 크기를 하나로 지정하면 이꼴난다

그래서 고민을 많이 했는데..

해결책이 의외로 간단했다



임시라벨 생성

말그대로 임시로 라벨을 만드는거다.

임시로 컨텐츠가 들어간 라벨을 만들기
-> 그 라벨사이즈로 셀 크기 부여하기

기가막히다


extension HomeVC: UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

                let tmpLabel : UILabel = UILabel()
                tmpLabel.text = tagList[indexPath.item]
                return CGSize(width: nt(tmpLabel.intrinsicContentSize.width), height: 35)

        }
    }

임시로 만든 tmpLabel에 컨텐츠를 넣은 후 그 라벨의 가로길이를 셀의 가로길이로 반환하게 했다


라벨의 가로길이를 반환하는법은 아래 링크를 참고했다
(사랑해요 스택오버플로우 당신없이는 못살아)

https://stackoverflow.com/questions/30481931/how-to-get-the-correct-width-of-a-uilabel-after-the-text-has-been-set


profile
김선달 개발블로그

0개의 댓글