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

Jehyeon Lee·2024년 9월 21일
0

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

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개의 댓글

관련 채용 정보