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를 추가해주길 기다릴 뿐…