Search
🍯

Stick To Top 애니메이션

부제
카테고리
UIKit
세부 카테고리
애니메이션
Combine 카테고리
최종편집일
2022/09/20 08:10
작성중
관련된 포스팅
생성 일시
2022/07/16 14:40
태그
Stick
안녕하세요! iOS dev 루크입니다!
오늘은 위와 같이 상단에 붙어서 스크롤을 내리면 크기가 커지는 헤더를 만들어 볼거에요!

사전 준비

스크롤 뷰와 그 안의 이미지를 준비해보았습니다.
주의할 점은 이미지의 leading trailing 을 잡아주지 않는 것이에요! ( 나중에 이미지가 확대되게 하기 위해)
aspect Ratio 와 이미지의 height 만 제약조건을 걸어줍시다
그리고 뷰 컨트롤러로 아웃렛을 따와줍니다.
class ViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! //이미지의 top constraint @IBOutlet weak var topConstraint: NSLayoutConstraint! //이미지의 height constraint @IBOutlet weak var heightConstraint: NSLayoutConstraint! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. //delegate 채택 scrollView.delegate = self } }
Swift
복사
오늘 사용할 delegate 메서드는 아래와 같습니다!
extension HomeViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { //스크롤 동작시마다 여러번 호출 } }
Swift
복사
바로 UIScrollViewDelegate 의 scrollViewDidScroll(_ scrollView: UIScrollView) 인데요
스크롤 뷰의 메서드인 요녀석은 사용자가 스크롤을 할 때마다 반복적으로 호출된답니다!
sticky header 의 동작은 크게 두가지로 설명할 수 있을 것 같습니다
1.
사용자가 스크롤을 내린 만큼 이미지의 크기를 증가시킨다.
2.
사용자가 스크롤을 내려도 이미지의 상단이 뷰의 맨 위에 붙어있게 한다.
먼저 사용자가 스크롤을 얼마만큼 내렸는지를 알아야겠죠
extension HomeViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { //스크롤 동작시마다 여러번 호출 let offset = scrollView.contentOffset.y print(offset) } }
Swift
복사
scrollViewDidScroll 메서드 내부에서
위처럼 scrollViewcontentOffset을 반복적으로 읽어오면 됩니다!
한번 출력시켜 볼까요?
현재 스크롤 위치를 잘 읽어오는 것을 볼 수 있습니다 ㅎㅎ
자이제 사용자가 스크롤을 얼마 만큰 내렸는지를 알아 왔으니 그 만큼 뷰를 수정해 주어야 겠죠?
extension ViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { //스크롤 동작시마다 여러번 호출 let offset = scrollView.contentOffset.y // offset 에 따른 이미지의 크기 수정 if offset < 0 { heightConstraint.constant = 300 - offset topConstraint.constant = offset } else { heightConstraint.constant = 300 } } }
Swift
복사
offset 이 0 보다 작을 때, contentOffset의 y 만큼 height 를 크게 해줍니다
뺄셈을 해주는 이유는 contentOffset 이 음수이기 때문이죠
0보다 클 때는 원래 이미지의 크기를 유지해주기 위해 상수값을 할당해줍니다.
그리고 실행해보면!
제대로 작동하는 것을 볼 수 있습니다 ㅎㅎ
다만 이러한 구현 방식에는 한가지 문제가 있는데요
바로 leading trailing 제약조건이 없기 때문에
넓이가 다른 기기에서 실행했을 경우.
이미지가 짤리거나 화면보다 작을 수 있습니다.
이러한 이슈에 대한 해결책도 조만간 만들어서 업데이트 해보겠습니다!
읽어주셔서 감사해요 ㅎ
본 포스팅은 위 게시글을 참고해서 작성되었습니다.