본문 바로가기
🍎 iOS

[iOS/Swift] UICollectionView Dynamic Height with AutoConstraint

by 틴디 2023. 3. 25.
728x90
반응형
  • UICollectionViewDelegateFlowLayout에서 sizeForItemAt에 정의
extension QuoteViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let margin = 16 + 16
        let quote = viewModel?.updates[indexPath.row]
        return QuoteListCollectionViewCell.fittingSize(availableWidth: UIScreen.main.bounds.width - CGFloat(margin), quote: quote)
    }
}
  • UICollectionViewCell에 fittingSize 정의
  • 이때 UIColletionViewCell의 contentView에 들어가 subView들은 AutoConstraint로 정의 되어야 함
    static func fittingSize(availableWidth: CGFloat, quote: Quote?) -> CGSize {
        guard let quote = quote else { return .zero }
        let cell = QuoteListCollectionViewCell()
        cell.configuration(dataSource: quote)
        
        let targetSize = CGSize(width: availableWidth, height: UIView.layoutFittingCompressedSize.height)
        return cell.contentView.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: .required, verticalFittingPriority: .fittingSizeLevel)
    }
  • width는 고정된 값을 가지고 height는 데이터 값에 따라 높이가 변경되어야 하므로 targetSize에 UIView.layoutFittingCompresssedSize.height로 설정
  • width는 고정이므로 리턴에서 withHorizontalFittingPriority는 required로, verticalFittingPriority는 fittingSizeLevel로 정의
728x90
반응형

댓글