Как я могу изменить внешний вид панели навигации MFMailComposeViewController в SwiftUI?

#ios #swift #swiftui #uinavigationbar #mfmailcomposeviewcontroller

#iOS #swift #swiftui #uinavigationbar #mfmailcomposeviewcontroller

Вопрос:

Я пытаюсь изменить внешний вид MFMailComposeViewController панели навигации. Внешний UINavigationBar вид устанавливается глобально (внутри функции AppDelegate didFinishLaunchingWithOptions) на нужные цвета, однако при MFMailComposeViewController открытии панель навигации возвращается к значению по умолчанию с небольшой задержкой.

Что я пробовал (основываясь на некоторых предыдущих ответах на подобные вопросы):

  • настройка панели навигации ViewController в makeUIViewController функции
  • вызов методов внешнего вида ( UINavigationBar.appearance() ) перед инициализацией MFMailComposeViewController
  • переопределить метод MFMailComposeViewController ‘s viewDidLoad

Это ошибка, и если нет, то как я могу изменить внешний вид MFMailComposeViewController панели навигации?

Как воспроизвести: (версия Xcode: 12.3, версия iOS: 14.3)

MailViewNavbarApp.swift

 class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        let coloredNavAppearance = UINavigationBarAppearance()
        coloredNavAppearance.configureWithOpaqueBackground()
        coloredNavAppearance.backgroundColor = .gray
        coloredNavAppearance.titleTextAttributes = [.foregroundColor: UIColor.yellow]
        coloredNavAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.yellow]

        UINavigationBar.appearance().tintColor = .yellow
        UINavigationBar.appearance().standardAppearance = coloredNavAppearance
        UINavigationBar.appearance().scrollEdgeAppearance = coloredNavAppearance
        return true
    }
}


@main
struct MailViewNavbarApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
 

Просмотр почты.swift

 struct MailView: UIViewControllerRepresentable {
    @Binding var isShowing: Bool
    let email: String

    func makeCoordinator() -> Coordinator {
        Coordinator(isShowing: $isShowing)
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<MailView>) -> MFMailComposeViewController {
        let vc = MFMailComposeViewController()
        vc.setToRecipients([email])
        vc.mailComposeDelegate = context.coordinator

        return vc
    }

    func updateUIViewController(
        _ vc: MFMailComposeViewController,
        context _: UIViewControllerRepresentableContext<MailView>
    ) {}

    class Coordinator: NSObject, MFMailComposeViewControllerDelegate {
        @Binding var isShowing: Bool

        init(isShowing: Binding<Bool>) {
            _isShowing = isShowing
        }

        func mailComposeController(_: MFMailComposeViewController,
                                   didFinishWith _: MFMailComposeResult,
                                   error: Error?) {
            isShowing = false
        }
    }
}
 

contentView.swift

 import SwiftUI
import MessageUI

struct ContentView: View {
    @State var isShowingMailView = false
    
    var body: some View {
        Button(action: {
            self.isShowingMailView.toggle()
        }) {
            Text("Tap me")
        }
        .disabled(!MFMailComposeViewController.canSendMail())
        .sheet(isPresented: $isShowingMailView) {
            MailView(
                isShowing: $isShowingMailView,
                email: "test@email.com"
            )
        }
    }
}
 

Спасибо за вашу помощь!