Things take time

[SWIFT] 스크롤할 때, 하단의 탭바 숨기기(보이기) 본문

iOS (기능)

[SWIFT] 스크롤할 때, 하단의 탭바 숨기기(보이기)

겸손할 겸 2017. 10. 30. 10:21

[로직]


테이블 뷰나 스크롤 뷰가 있는 뷰에서 상하단으로 드래그할 때마다 발생되는 이벤트에 탭 바를 숨기거나 보일때 필요한 기능이다.


[코드]

    @available(iOS 2.0, *)
    public func scrollViewWillBeginDragging(_ scrollView: UIScrollView){
        if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0{
            print("y<0")
            changeBar(hidden: true)
        }else {
            print("y>0")
            changeBar(hidden: false)
        }
    }

당연히 딜리게이트는 되어있다고 가정한다. (테이블 뷰 는 스크롤 뷰를 기본적으로 딜리게이트 되어있음)


    func changeBar(hidden:Bool){
        guard let tabBar = self.tabBarController?.tabBar else {
            return;
        }
        // 탭바가 사라져 있다면 애니메이션(사라지는)효과를 주지 않음
        if tabBar.isHidden == hidden{
            return;
        }
        let frame = tabBar.frame;
        let offset = hidden ? (frame.size.height) : -(frame.size.height)
        let duration:TimeInterval = 0.5
        tabBar.isHidden = false;
        UIView.animate(withDuration: duration, animations: {
            ()-> Void in
            tabBar.frame = frame.offsetBy(dx: 0, dy: offset)
        }, completion: {
            (isTrue) -> Void in
            if isTrue{
                tabBar.isHidden = hidden;
            }
            /* isTrue 없이 그냥 파라미터 첫 번째것을 쓸때
            if $0{
                tabBar.isHidden = hidden;
            }
            */
        });
    }
    }

간단히 설명하면

현재 탭바 컨트롤러의 탭바 값을 얻어오고, 만약 원래 숨겨져 있는 상태인데 또 숨기라는 명령어가 오면 리턴시킨다. (반대도 마찬가지)


그리고 hidden 파라미터의 값에 따라 탭바의 프레임 높이에 대한 양, 음수값을 저장해 두고.. 0.5초의 사라지는 시간(기간)값을 설정한다.

그리고 탭바의 숨김 효과를 해제한다. (아래에서 위로 올라오든, 위에서 아래로 내려가든.. 애니메이션 효과를 보여줘야 하므로)


이 후 동작하면 된다. 


$0이 의미하는 것은 첫 번째 파라미터를 의미한다.