Post

UIKit - 스크롤 시 TabBar 숨김 처리하기

UIKit - 스크롤 시 TabBar 숨김 처리하기

스크롤 시 TabBar를 숨김처리 하기 위해선 delegate 메서드인 scrollViewWillEndDragging을 구현하여 처리할 수 있음.

velocity 값은 아래로 스크롤 했을 경우 양수 값을, 위로 스크롤 했을 경우 음수 값을 가짐.

구현 로직

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
extension BookListViewController: UITableViewDataSource, UITableViewDelegate{
    
    // 중복 연산을 막기 위한 프로퍼티
    private var isHiddenTabBar: Bool = false

    func scrollViewWillEndDragging(
        _ scrollView: UIScrollView,
        withVelocity velocity: CGPoint,
        targetContentOffset: UnsafeMutablePointer<CGPoint>
    ) {
        // TabBar height 값 가져오기
        let height = self.tabBarController?.tabBar.frame.height ?? 0
        
        UIView.animate(withDuration: 0.5) {
            // 위로 스크롤 했으며 TabBar 숨김 처리가 되어 있는 상태일 경우 처리
            if velocity.y < 0 && self.isHiddenTabBar{
                // 투명도 조정
                self.tabBarController?.tabBar.alpha = 1.0

                // TabBar의 origin 값을 조정하여 화면 위로 다시 나타나도록 처리
                self.tabBarController?.tabBar.frame.origin = CGPoint(x: 0, y: UIScreen.main.bounds.maxY - height)

                // view의 origin y 값에 TabBar의 높이 값을 빼줘서 TabBar가 렌더링될 영역을 확보함 
                self.view.frame.origin = CGPoint(x: self.view.frame.origin.x, y: self.view.frame.origin.y - height)

                // TabBar 숨김 처리 false
                self.isHiddenTabBar = false
            }
            // 아래로 스크롤 했으며 TabBar 숨김 처리가 되어 있지 않은 상태일 경우 처리
            else if velocity.y > 0 && !self.isHiddenTabBar{
                // 투명도 조정
                self.tabBarController?.tabBar.alpha = 0.0

                // TabBar의 origin 값을 조정하여 화면 밖으로 내려줌
                self.tabBarController?.tabBar.frame.origin = CGPoint(x: 0, y: UIScreen.main.bounds.maxY)

                // TabBar가 차지하고 있는 영역이 없어졌기 때문에 view의 origin y에 TabBar의 높이 값을 더해 빈 공간을 채워줌
                self.view.frame.origin = CGPoint(x: self.view.frame.origin.x, y: self.view.frame.origin.y + height)

                // TabBar 숨김 처리 true
                self.isHiddenTabBar = true
            }
        }
    }
}

결과

image

Reference

This post is licensed under CC BY 4.0 by the author.