#ios #swift #swiftui #uinavigationbar #mfmailcomposeviewcontroller
#iOS #swift #swiftui #uinavigationbar #mfmailcomposeviewcontroller
Вопрос:
Я пытаюсь изменить внешний вид MFMailComposeViewController
панели навигации. Внешний UINavigationBar
вид устанавливается глобально (внутри функции AppDelegate didFinishLaunchingWithOptions) на нужные цвета, однако при MFMailComposeViewController
открытии панель навигации возвращается к значению по умолчанию с небольшой задержкой.
Что я пробовал (основываясь на некоторых предыдущих ответах на подобные вопросы):
- настройка панели навигации ViewController в
makeUIViewController
функции - вызов методов внешнего вида (
UINavigationBar.appearance()
) перед инициализациейMFMailComposeViewController
- переопределить метод
MFMailComposeViewController
‘sviewDidLoad
Это ошибка, и если нет, то как я могу изменить внешний вид 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"
)
}
}
}
Спасибо за вашу помощь!