SwiftUI에서 TabView 안에 NavigationView 사용시 SubView 를 NavigationLink로 호출하면 SubView가 노출되지만 하단에 TabView가 그대로 노출되어 있다. 즉 FullScreent 으로 SubView를 노출하려고 했는데 이게 안된다. ㅜㅜ

 

[구조1]

NavigationView 

         ㄴ TabView 

 

[구조2]

TabView 

      ㄴ NavigationView 

 

[구조1]의 경우 SubView NavigationLink 하게 되면 TabView가 가려지지만 [구조2]의 경우 TabView가 그대로 노출됨.

[구조2]와 같은 경우 탭을 숨기는 기능이 없냐~ 있다.

NavigationLink("Click") {
	Text("Next View")
		.toolbar(.hidden, for: .tabBar)  //iOS 16 이상
}

 

하지만 iOS 16 이상에서만 사용이 가능함. ㅜㅜ

 

커스텀 해서 사용해야됨.

// MARK: Tab Show/Hidden 처리
extension UIView {
    func allSubviews() -> [UIView] {
        var allSubviews = subviews
        for subview in subviews {
            allSubviews.append(contentsOf: subview.allSubviews())
        }
        return allSubviews
    }
}

extension UITabBar {
    private static var originalY: Double?
    
    static public func changeTabBarState(shouldHide: Bool) {
        let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
        windowScene?.windows.first(where: { $0.isKeyWindow })?.allSubviews().forEach({ view in
            if let tabBar = view as? UITabBar {
                if !tabBar.isHidden && shouldHide {
                    originalY = (tabBar.superview?.frame.origin.y)!
                    tabBar.superview?.frame.origin.y = (tabBar.superview?.frame.origin.y)! + 4.5
                } else if tabBar.isHidden && !shouldHide {
                    guard let originalY else {
                        return
                    }
                    tabBar.superview?.frame.origin.y = originalY
                }
                tabBar.isHidden = shouldHide
                tabBar.superview?.setNeedsLayout()
                tabBar.superview?.layoutIfNeeded()
            }
        })
    }
}

 

 

[사용방법]

ForEach(replayListViewModel.replayContents.indices, id: \.self) { index in
    let item = replayListViewModel.replayContents[index]
    NavigationLink {
        SubView()
            .onAppear() {
                UITabBar.changeTabBarState(shouldHide: true)   //SubView 노출시 TabView숨김
            }
            .onDisappear() {
                UITabBar.changeTabBarState(shouldHide: false)  //SubView 사라지면 TabView보임
            }
            //  .toolbar(.hidden, for: .tabBar) // iOS16 이상
            
    } label: {
        Text("index : \(index)")
    }
}

 

+ Recent posts