You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:21:42