contents
컬렉션뷰 셀마다 다른 Width
해당 기능 구현은 어렵지 않습니다.
일단 하나의 Label를 두고 해당 Label이 현재 셀에 들어갈 text를 넣어줬을 때(font, attribute 완전히 적용) 얼만큼의 width를 가지는지 확인하면 됩니다.
private func calculateCellWidth(index: Int) -> CGFloat {
let label = UILabel()
label.text = lists[index]
label.font = .systemFont(ofSize: 14)
label.sizeToFit()
return label.frame.width + 20
}
Swift
복사
label의 width를 CGFloat의 형태로 return해줍니다.
width의 길이는 sizeForItemAt메서드에서 width값으로 넣어주면 됩니다.
상단바 애니메이션
상단바가 스크롤에 따라서 사라지기도 하고 나타나기도 합니다.
해당 기능은 CGAffineTransform과 ScrollView 메소드들을 사용해서 구현했습니다.
// MARK: - ScrollDelegate
extension HomeVC {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offset = scrollView.contentOffset.y
if offset > 115, !scrollingUp {
topHeader.transform = CGAffineTransform(translationX: 0, y: -(offset/10))
topHeader.alpha = 1.0 - (offset/150)
} else {
topHeader.transform = .identity
topHeader.alpha = 1.0
}
}
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview)
if actualPosition.y > 0 {
scrollingUp = true
} else {
scrollingUp = false
}
}
}
Swift
복사
•
scrollViewDidScroll : 스크롤이 될 때, 스크롤을 감지합니다.
→ 계속 스크롤을 감지하기 때문에 offset를 두어서 default에서 어느정도 내려왔는지, 올라갔는지 확인합니다. 위로 스크롤할 시에는 > 0 아래로 스크롤 + default 이상 늘릴시에 < 0가 됩니다.
•
scrollViewWillBeginDecelerating : 스크롤이 감속하기 시작할 때를 감지합니다.
→ 현재 위로, 혹은 아래로 가고 있는지 확인할 수 있습니다.
→ 해당 기능을 사용해서 위, 아래를 판단하는 scrollingUp 변수의 값을 바꿔줬습니다.
•
CGAffineTransform(translationX: 0, y: -(offset/10)) : Transform를 시켜줍니다. X축, Y축 원하는 곳을 이동시켜줍니다. 이동 코드 외에도 회전, 스케일 변경 등이 있습니다.
•
.identity : 원래 제자리로 돌아오는 코드입니다.