• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

당근마켓 클론코딩 - 1

당근마켓 클론코딩 1주차 에서 이어지는 내용

UITableView - Sticky header 야매로 구현하기

+ 스크롤에 따라 alpha값 조절하기

201102-1

당근마켓 클론코딩을 하다가 이게 하고싶어서.. 구현하는 과정을 기록하려고 한다 ✏️

그냥 Sticky header가 아니라,, 위에 첫번째 뷰는 사라져야하고 두번째 뷰는 sticky 해야 해서.. 이렇게 구현했다 ,,

나중에 언젠가 써먹을 날이 올 듯 ? ( ◠‿◠ )..

간단히 먼저 설명하자면… table cell이 나오는 부분의 윗부분을 모조리 headerView라고 하고

스크롤에 따라 headerView에 max,min height값을 주는 것!

결과물 먼저 보기

AnyConv

화질이 와이라노지만.. 성공~!

뷰 짜기

image

View Controller에 Table View 올려주고 Prototyle Cells까지 다 작업해 준 후에

image

상단에서 움직일 / 고정될 뷰를 올려준다

근데 이때! view가 TableView에 들어가도록 view를 넣는게 아니라 그냥 위에 얹는거임

image

MainTableView : 테이블 뷰

HeaderView : 상단 전체 뷰

​ 그리고 그 안에 UpperHeaderView : alpha값 조절할 view, View : segmented control이 있는 뷰(인데 저 부분은 아직 작업 안 해서 저 상태)

MainTableView랑 HeaderView가 같은 hierarchy에 있어야 함!

오토레이아웃은 알아서 하는데 headerView에 height constraint는 필수! 나중에 이걸 NSLayoutConstraint에 연결해서 쓸거라서..

글고.. 데이터 불러오고 Model 만들고 이런것도 다 했다 치고 ~

outlet 연결, 변수 선언

let maxHeight: CGFloat = 100.0 //headerView의 최대 높이값
let minHeight: CGFloat = 100.0 //headerVIew의 최소 높이값

@IBOutlet weak var mainTableView: UITableView!{
    didSet {
        mainTableView.contentInset = UIEdgeInsets(top: maxHeight, left: 0, bottom: 0, right: 0)
     }
}
@IBOutlet weak var headerView: UIView!
@IBOutlet weak var upperHeaderView: UIView!
}

배치했던 view들 outlet 선언해 줌

아까 위에서 HeaderView에 잡아준 height constraint를 outlet연결 해 줄건데, (스크롤하는거에 따라 headerView의 높이를 바꿔줄거라서)

@IBOutlet weak var heightConstraint: NSLayoutConstraint! {
    didSet {
        heightConstraint.constant = maxHeight
    }

먼저 코드를 쓰고 아래처럼 드래그해서 연결해주면 된다

AnyConv com__Screen Recording 2020-11-03 at 1 43 25 AM

scrollViewDidScroll() 메소드 구현

tableView가 scroll 됨에 따라 UI가 바뀌어야되므로 scrollViewDidScroll() 메소드를 구현해줄건데,

이 함수는 UIScrollViewDelegate의 메소드다. 스크롤이 됐을 때 마다 호출됨 - 쓰윽 스크롤해도 몇십번 호출 돼 있음

extension MainTableVC: UITableViewDelegate {
  func scrollViewDidScroll(_ scrollView: UIScrollView) {
   	//아래 나오는 내용들은 다 이 함수 안에 들어가 있는 코드
  }
}

스크롤에 따라 특정 뷰의 특정 부분까지만 숨기기

if scrollView.contentOffset.y < 0 {
    heightConstraint.constant = max(abs(scrollView.contentOffset.y), minHeight)
} else {
    heightConstraint.constant = minHeight
}

스크롤에 따라 특정 부분 alpha값 서서히 조절하기

자자.. 먼저 해야 하는 것은 offset을 계산하는 것~!

AnyConv

let offset = -scrollView.contentOffset.y
let percentage = (offset-100)/50
upperHeaderView.alpha = percentage

이렇게 해주면.. 끝… ㄱ- ~

let percentage = (offset-100)/50 이 부분은 offset값에 따라 내가 원하는 alpha 값을 얻기 위해 계산한거라..

기존 뷰 높이에 따라 달라집니다..

도움받은 자료들, 검색하다 주운 자료들

https://stackoverflow.com/questions/46692316/how-to-hide-a-uiview-while-scrolling

https://stackoverflow.com/questions/31857333/how-to-get-uiscrollview-vertical-direction-in-swift

https://stackoverflow.com/questions/25263343/how-to-change-alpha-value-along-with-scrolling

https://stackoverflow.com/questions/43864557/scrolling-resizing-uitableview