초림이의 연구실

[SwiftUI] UINavigationBar hidden shadow

SwiftUI로 프로젝트를 구성하는 도중 UINavigationBar의 shadow 영역을 없애고 싶었다.

맨 아래에 있는 아주 조그만 부분인데.. iOS 15까지는 UINavigationBar의 shared appearance를 설정하여 전역으로 반영하는 코드를 사용했던것 같은데 iOS 16부터 뭔 짓을해도 없앨수가 없는 것 같다..

결국 SwiftUI-Introspect 라이브러리를 사용하여 아래와 같이 해결했다.

var body: some View {
    NavigationStack {}
    .introspect(.navigationStack, on: .iOS(.v16, .v17)) {
        delegate.configureNavigationBar($0)
    }
}

extension PRtifyAppDelegate: UIApplicationDelegate {
    func configureNavigationBar(_ navigationController: UINavigationController) {
        let navigationBarAppearance = UINavigationBarAppearance()
        navigationBarAppearance.shadowColor = .clear
        navigationBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
        navigationBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
        
        navigationBarAppearance.backgroundColor = .flatDarkBackground
        navigationBarAppearance.shadowImage = UIImage()
        
        navigationController.navigationBar.compactAppearance = navigationBarAppearance
        navigationController.navigationBar.standardAppearance = navigationBarAppearance
        navigationController.navigationBar.scrollEdgeAppearance = navigationBarAppearance
        navigationController.navigationBar.compactScrollEdgeAppearance = navigationBarAppearance
    }
}

나는 이 방법이 최선의 방법이라고 생각하지 않는다. 어서 빨리 Apple이 관련 API를 추가해주길 기다릴 뿐…

Exit mobile version