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)")
}
}
'SwiftUI' 카테고리의 다른 글
[SwiftUI] UIImagePickerController 카메라,앨범 이미지 가져오기 (0) | 2024.05.30 |
---|---|
[SwiftUI] .fullScreenCover 로 NavigationView 열기 (0) | 2024.05.30 |
[SwiftUI] Custom Present ViewController (0) | 2024.05.29 |
[SwiftUI] CustomDialog(alert)/그라데이션 버튼/View 투명처리 (0) | 2024.05.22 |
[SwiftUI] 고정식 BottomSheet Custom (IOS 16 미만) (0) | 2024.05.21 |