제스쳐로 뒤로가기 + 특정 부분이면 막기

Jehyeon Lee·2024년 9월 21일

제스처를 사용하여 뒤로가기

SWiftUI 에서 제공하는 제스처로 뒤로가기 많이들 보셨을겁니다.
그것을 구현하도록 하겠습니다.
코드는 단순해서 밑에 코드만 적도록 하고 특정부분을 막는게 주된 글입니당

extension UINavigationController: @retroactive UIBarPositioningDelegate {}
extension UINavigationController: @retroactive UINavigationBarDelegate, @retroactive UIGestureRecognizerDelegate {
    open override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }
    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}

@retroactive 프로토콜 채택 -> https://velog.io/@ljh3904_a/retroactive

특정 뷰로는 제스쳐 막기

이제 로그인 창으로 가는것을 막아야합니다.

enum TrackingType {
    case home
    case sign
    case vote
    case mypage
    case bookmark
}

class ViewTracker: ObservableObject {
    static let shared = ViewTracker()
    @Published var currentView: TrackingType = .sign
        
    func updateCurrentView(to newView: TrackingType) {
        jhPrint(newView)
        currentView = newView
    }
}

뷰를 탐색해서 싱글톤으로 현제 뷰의 상태를 저장해두고 이걸로 비교 하는 방식으로 만들었습니다.

 public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        var isEnabled: Bool = false
        switch ViewTracker.shared.currentView {
            case .home, .sign, .bookmark:
                isEnabled = false
            case .mypage, .vote:
                isEnabled = true
        }
        return viewControllers.count > 1 && isEnabled
        
    }

각 뷰가 생성될 때 type 에맞게 넣어서 조절하였습니다.

.onAppear {
            ViewTracker.shared.updateCurrentView(to: .mypage)
        }

참고

https://green1229.tistory.com/507

profile
공부한거 느낌대로 써내려갑니당

0개의 댓글