layoutSubviews는 뷰의 레이아웃이 변경될 때마다 호출됩니다. 따라서 itemSize를 매번 재설정하면 불필요한 연산이 발생할 수 있습니다. 이를 방지하려면 기존 크기와 비교해 변경된 경우에만 업데이트하도록 처리하세요.
변경 전 코드
override func layoutSubviews() {
super.layoutSubviews()
if let layout = listCollectionView.collectionViewLayout as? UICollectionViewFlowLayout {
let width = basicView.bounds.width / 2
let height = basicView.bounds.height / 2
layout.itemSize = CGSize(width: width, height: height)
}
}
변경 후 코드
private var lastKnownSize: CGSize = .zero
override func layoutSubviews() {
super.layoutSubviews()
let currentSize = basicView.bounds.size
if lastKnownSize != currentSize {
if let layout = listCollectionView.collectionViewLayout as? UICollectionViewFlowLayout {
let width = currentSize.width / 2
let height = currentSize.height / 2
layout.itemSize = CGSize(width: width, height: height)
}
lastKnownSize = currentSize
}
}
설명의 흐름
- currentSize는 항상 최신 크기:
basicView.bounds.size를 기준으로 계산됩니다. 화면이 회전하거나 레이아웃이 변경될 경우, 크기가 달라질 수 있습니다. - lastKnownSize는 이전 크기를 기억:
이전에 확인한 크기를 저장해 둔 값으로, 마지막으로 레이아웃을 업데이트했을 때의 크기를 나타냅니다. - 비교 조건:
if lastKnownSize != currentSize는 이전 크기와 현재 크기가 다른 경우에만 레이아웃을 다시 계산합니다.- 이렇게 하면 불필요하게 레이아웃을 계속 계산하는 것을 방지합니다.
- 크기가 다를 때만 레이아웃 변경:
레이아웃이 변경될 필요가 있을 때만 itemSize를 다시 설정합니다. - 업데이트 후 저장:새로운 레이아웃을 계산한 뒤, 현재 크기를 lastKnownSize에 저장하여 다음 호출 시 비교 기준으로 사용합니다.
왜 이렇게 하는가?
- 최적화: layoutSubviews는 매우 빈번하게 호출됩니다. 크기가 동일하다면 굳이 레이아웃을 다시 설정할 필요가 없습니다.
- 성능 개선: 불필요한 연산과 UICollectionViewFlowLayout 업데이트를 최소화합니다.
- 정확성: 화면 회전이나 크기 변경 같은 이벤트에만 대응하여 정확하게 레이아웃을 업데이트합니다.
layout.itemSize 초기 설정
UICollectionViewFlowLayout의 itemSize는 초기값을 설정하지 않아도 되지만, 초기화 코드에서 기본값을 설정해두는 것이 유지보수에 도움이 됩니다. 기본 크기를 지정하거나 초기화된 크기를 명시하면 명확합니다.
let listCollectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.minimumLineSpacing = 10
layout.scrollDirection = .horizontal
// 이 부분입니다.
layout.itemSize = .zero
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.showsHorizontalScrollIndicator = false
return collectionView
}()
'UIKIT' 카테고리의 다른 글
동일한 조건 분기를 재사용하는 방법 (1) | 2024.11.22 |
---|---|
UINavigationBarAppearance() 에 대해서 (0) | 2024.11.21 |
델리게이트 패턴으로 화면 전환하기 (2) | 2024.11.17 |
UISheetPresentation을 통해 수정, 삭제, 닫기 버튼 기능 구현 (0) | 2024.11.16 |
FileManager 사용방법 - 수정 (3) | 2024.11.14 |