본문 바로가기
iOS

[iOS] SwiftUI Navigation BackButton 일괄 변경하기

by DuncanKim 2024. 8. 8.
728x90

[iOS] SwiftUI Navigation BackButton 일괄 변경하기

 

 

네비게이션 백버튼을 일괄적으로 변경해야 했다. 일반적으로 블로그에는 백버튼을 이전 뷰에서 navigationItem을 설정해주는 방식으로 적용을 해주지만, 뷰가 수십개라면...? 물론 복사하기 붙여넣기 열심히 하면 되지만, 적용이 안되는 뷰가 있을 수도 있으며, 그거 일일이 다 찾아서하는 것은 너어어어무 귀찮은 일이라는 생각이 들었다. 그래서 어딘가에서 백버튼을 일괄적으로 설정해줄 수 있지 않을까?라는 한낱 희망을 붙잡고 일괄 변경하는 코드를 만들어 보았다.

 

 

1. AppDelegate 준비

 

SwiftUI의 경우 AppDelegate가 없다. 그래서 만들어주어야 한다. 뭐 다른 API를 쓴다고 하면 분명히 이전에 만들어둔 것이 있을 것이다. 

 

class AppDelegate: NSObject, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
    ) -> Bool {
        setBackButtonColor()
        return true
    }
}

 

application 함수 중 didFinishLaunchingWithOptions를 구현해준다.

Naver든 Google이든 Firebase든 사용하고 있다면 이미 구현되어 있을 것이다.

 

 

2. Extension 구현

// MARK: - 백버튼 관련 통합 세팅
extension AppDelegate {

    /// 백버튼의 타이틀을 clear 색상으로 바꾸고, tintColor를 mainTextColor로 바꾼다.
    private func setBackButtonColor() {
        let backButtonAppearance = UIBarButtonItemAppearance()
        let appearance = UINavigationBarAppearance()

        backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
        appearance.configureWithOpaqueBackground()
        appearance.backButtonAppearance = backButtonAppearance
        appearance.backgroundColor = UIColor(Color.backgroundColor)

        UINavigationBar.appearance().standardAppearance = appearance
        UINavigationBar.appearance().compactAppearance = appearance
        UINavigationBar.appearance().scrollEdgeAppearance = appearance
        UIBarButtonItem.appearance().tintColor = UIColor(Color.mainTextColor)
    }
}

 

UIBarButtonItemAppearance, UINavigationBarAppearance를 사용하여 백버튼 컬러를 바꾼다. 나의 경우, 백버튼을 Chevron으로 그대로 두고, 색과 타이틀만 없애면 되기 때문에, 타이틀 컬러를 clear로 하고, 네비게이션 바 색상과 바 아이템 색상만 일괄적으로 변경되도록 만들었다.

 

이렇게 네비게이션 백버튼을 바꿀 수 있었다.

추가적으로 네비게이션과 관련된 일괄적인 처리가 필요하다면, UIBarButtonItemAppearance, UINavigationBarAppearance를 사용해서 변경할 수 있을 것이다.

 

다만, 이러한 처리가 SwiftUI의 특성에 맞는 것은 아니다. SwiftUI는 선언적 UI 프레임워크로, 각 뷰는 그 자체로 독립적이며 명시적인 정의가 필요할 것인데, 이렇게 되면, 특정 뷰에서 독립적으로 필요한 처리를 할 때, 의도치 않은 오류를 불러올 수 있을 것이다. 하지만, 나의 경우 현재 일괄된 디자인만을 적용하고 있고, 커스텀한 처리는 필요가 없었어서 이렇게 코드를 구성해서 적용을 해보았다! 코드 관리 측면에서는 편하고, 빠뜨리는 부분 없이 구현할 수 있어서 대체적으로 만족스럽긴 하다.

 

귀찮음 해결끝!

 

728x90

댓글