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)
}