MFMailComposeViewController高对比度模式下全屏导航栏按钮不可见问题
问题与解决方案:开启「增加对比度」后全屏邮件撰写界面按钮消失
问题描述
- 当系统「显示与文字大小」设置中开启「增加对比度」选项后,以
.fullScreen模态样式打开MFMailComposeViewController时,顶部的Back和Send按钮完全不可见 - 切换为popover模态样式打开时,按钮显示正常
截图说明:全屏模式下的邮件撰写界面顶部无任何可交互的导航按钮,仅能看到收件人、主题输入框及邮件内容区域
复现代码
if MFMailComposeViewController.canSendMail() { let composer = MFMailComposeViewController() composer.mailComposeDelegate = self composer.setSubject("activityType") composer.setToRecipients(["test@gmail.com"]) composer.setSubject("Sample Subject") composer.setMessageBody("<html><body>Sameple Body<br /><br /></body></html>", isHTML: true) composer.modalPresentationStyle = .fullScreen composer.modalTransitionStyle = .crossDissolve self.present(composer, animated: true, completion: nil) }
解决方案
方案1:更换模态展示样式(最简单有效)
将modalPresentationStyle改为.pageSheet,这个样式在iOS 13+系统中默认适配辅助功能设置,既能保持近似全屏的显示效果,又能确保按钮在开启增加对比度时正常显示:
composer.modalPresentationStyle = .pageSheet
方案2:监听辅助功能变化,动态调整导航栏样式
通过监听系统「增加对比度」状态的变化,手动设置导航栏按钮的颜色,确保可见性:
// 在视图控制器的viewDidLoad中添加监听 override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(adjustNavBarForAccessibility), name: UIAccessibility.darkerSystemColorsStatusDidChangeNotification, object: nil) // 初始化时先检查一次状态 adjustNavBarForAccessibility() } // 动态调整导航栏按钮样式 @objc private func adjustNavBarForAccessibility() { let buttonColor: UIColor = UIAccessibility.isDarkerSystemColorsEnabled ? .systemBlue : .label UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: buttonColor], for: .normal) UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: buttonColor.withAlphaComponent(0.5)], for: .disabled) } // 记得在销毁时移除监听 deinit { NotificationCenter.default.removeObserver(self) }
方案3:自定义邮件撰写界面(备选)
如果必须使用全屏模式且上述方案无效,可以考虑基于MessageUI的核心能力,自定义一套邮件撰写UI,完全控制所有元素的显示逻辑,但这种方式开发成本较高,仅推荐在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

