티스토리 뷰
728x90
반응형
내용
- UICollectionView 의 스크롤을 함에 따라서 같이 움직이는 상단 바를 구현해보자
완성
🌊 애니메이션 넣기
// ✅ "뒷면" 라벨의 하단으로 이동시킬 때
UIView.animate(withDuration: 0.3) {
// 상단 바의 위치를 ("뒷면" 라벨의 x 좌표) - (상단 바의 x 좌표) 만큼 이동.
self.statusMovedView.transform = CGAffineTransform(translationX: self.backTextLabel.frame.origin.x - self.statusMovedView.frame.origin.x + 5, y: 0)
}
// ✅ 다시 "앞면" 라벨의 하단으로 돌아올 때
UIView.animate(withDuration: 0.3) {
// 원래 위치로 원상복구
self.statusMovedView.transform = .identity
}
🌊 스크롤하는 index 의 위치에 따른 분기 처리
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
// ✅ 스크롤뷰의 x 좌표를 가로길이로 나눠서 index 를 설정.(0(앞면), 1(뒷면))
let index = Int(round(scrollView.contentOffset.x / scrollView.frame.size.width))
// "뒷면" 라벨 하단으로 이동
if index == 1 {
UIView.animate(withDuration: 0.3) {
self.statusMovedView.transform = CGAffineTransform(translationX: self.backTextLabel.frame.origin.x - self.statusMovedView.frame.origin.x + 5, y: 0)
}
}
// "앞면" 라벨 하단으로 이동.
// else 를 사용하지 않는 이유는 "뒷면" 에서
else if index == 0 {
UIView.animate(withDuration: 0.3) {
self.statusMovedView.transform = .identity
}
}
}
위와 같이 구현하게 되었는데 마지막 셀에서 왼쪽으로 스와이프 할 때 다시 "앞면" 라벨 하단으로 animate 되는 경우가 생겨서 방지하는 코드도 추가했다.
그리고 공부하면서 몇가지 delegate 메서드가 있었는데 적당한 메서드를 골라보았다.
UIScrollViewDelegate 에 대해 알아보자.
iOS) UIScrollViewDelegate 에 대해 알아보자(Scrolling and Dragging)
🌊 scrollViewWillEndDragging(_:withVelocity:targetContentOffset:) 메서드 사용
private var currentIndex = 0
// ✅ 사용자가 스크롤을 멈출 때 호출.
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
// ✅ targetContentOffset : 스크롤 동작이 정지할 때 예상되는 offset. (0.0(앞면으로 갈 때) 또는 375.0(뒷면으로 갈 때. iPhone12 기준.))
let targetIndex = targetContentOffset.pointee.x / scrollView.frame.size.width
if targetIndex == 1 && currentIndex == 0 {
UIView.animate(withDuration: 0.3) {
self.statusMovedView.transform = CGAffineTransform(translationX: self.backTextLabel.frame.origin.x - self.statusMovedView.frame.origin.x + 5, y: 0)
}
currentIndex = 1
} else if targetIndex == 0 && currentIndex == 1 {
UIView.animate(withDuration: 0.3) {
self.statusMovedView.transform = .identity
}
currentIndex = 0
}
}
728x90
반응형
'iOS' 카테고리의 다른 글
iOS) available 알아보기 (0) | 2021.10.11 |
---|---|
iOS) UIModalTransitionStyle.partialCurl 알아보기 (0) | 2021.10.09 |
iOS) UIScrollViewDelegate 에 대해 알아보자(Scrolling and Dragging) (0) | 2021.10.06 |
iOS) UITextField 을 다뤄보자 (테두리/키보드업다운) (2) | 2021.10.05 |
iOS) HTTP 메시지 구조를 통해 GET, POST 이해하기 (0) | 2021.10.04 |
댓글
TAG
- YPImagePicker
- Firebase
- WidgetKit
- Algorithm
- Swift
- WWDC22
- MVVM
- Widget
- WWDC
- Objective-C
- async/await
- OpenSourceLibrary
- Protocol
- urlsession
- watchOS
- SwiftUI
- projectsetting
- RxCocoa
- UserDefaults
- IOS
- CloneCoding
- Notification
- 2022 KAKAO TECH INTERNSHIP
- MOYA
- containerBackground
- configurable widget
- APNS
- 서버통신
- github
- rxswift
최근에 올라온 글
최근에 달린 댓글
글 보관함
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
링크
- Total
- Today
- Yesterday