MFMessageComposeViewController深色模式下Cancel按钮样式无法自定义
问题根因
- 代码顺序错误:你之前的MFMessageComposeViewController相关代码先声明变量就设置导航栏属性,此时控制器实例还未初始化,所有属性设置都不会生效。
- 版本适配缺失:iOS 13 之后系统对MFMessageComposeViewController这类系统提供的通信类控制器,导航栏样式由
UINavigationBarAppearance控制,旧版全局appearance接口优先级低于系统默认样式,会被直接覆盖。另外这类系统控制器出于安全规则限制,仅支持修改按钮配色,不支持修改标题字体、导航栏背景等其他样式。 - 全局appearance设置对该控制器无效:MFMessageComposeViewController的视图层级属于系统私有域,不会继承你App里设置的全局UIBarButtonItem、UINavigationBar样式,必须拿到控制器实例后单独配置。
适配iOS 12.1 ~ iOS 15.4的可运行代码
// 先初始化控制器实例,再做属性设置 MFMessageComposeViewController *messageController = [MFMessageComposeViewController new]; // iOS12 旧版本适配 messageController.navigationBar.tintColor = [UIColor blueColor]; // iOS13+ 新导航栏样式规则适配 if (@available(iOS 13.0, *)) { UINavigationBarAppearance *navAppearance = [[UINavigationBarAppearance alloc] init]; // 保持系统默认导航栏背景,不要修改背景相关配置避免被系统拦截 [navAppearance configureWithDefaultBackground]; // 设置普通导航按钮(包含右上角Cancel按钮)的文字颜色 navAppearance.buttonAppearance.normal.titleTextAttributes = @{ NSForegroundColorAttributeName: [UIColor blueColor] }; // 同步设置Done按钮样式,避免其他系统按钮颜色不统一 navAppearance.doneButtonAppearance.normal.titleTextAttributes = @{ NSForegroundColorAttributeName: [UIColor blueColor] }; messageController.navigationBar.standardAppearance = navAppearance; messageController.navigationBar.scrollEdgeAppearance = navAppearance; } // 后续再设置messageController的代理、短信内容、收件人等其他属性
注意事项
- 不要尝试修改MFMessageComposeViewController的导航栏标题字体、背景图、左右按钮文字内容,这类自定义会被系统直接拦截,强制恢复默认样式。
- 测试自定义颜色前先用系统提供的
[UIColor blueColor]验证效果,确认你的自定义颜色分类[UIColor RepublicBrightBlue]已经正确加入当前编译target,避免颜色返回nil导致设置不生效。 - 不要在App启动时的全局appearance代理里配置MFMessageComposeViewController的样式,必须在控制器present前针对实例单独设置。
内容的提问来源于stack exchange,提问作者Eli017
相关产品推荐
相关产品推荐

