主题定制
从 5.30.0 版本开始,IMKit 支持主题定制功能,提供传统主题和欢快主题两种内置主题,同时支持自定义主题。
功能概述
IMKit 的主题定制功能提供了灵活的主题配置能力,包括:
- 内置主题:传统主题(Traditional)和欢快主题(Lively)
- 自定义主题:支持基于内置主题进行颜色和图片的自定义
- 深色模式:iOS 13+ 自动适配系统深色模式
- 动态切换:运行时无缝切换主题,无需重启应用
效果预览
| 传统主题-浅色 | 传统主题-深色 | 欢快主题-浅色 | 欢快主题-深色 |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
主题资源
在 RongIMKit.framework 组件文件夹下可以看到所支持的内置主题资源 RongCloudLively.bundle 和 RongCloud.bundle。RongCloudLively.bundle 为欢快主题资源包,RongCloud.bundle 为传统主题资源包。
选中 RongCloudLively.bundle并右键选择 Show Package Contents 即可看到内置的两套主题资源,文件夹名称即为主题类别。
我们以 “欢快主题” 为例,light 文件夹下包含 theme.plist 文件和 resources 资源文件夹。
theme.plist 文件存储了当前主题所使用的图片、颜色等要素的值,深色和浅色主题下的 theme.plist 文件中的 colors key 均相同;
resources 资源文件夹存储了当前主题所使用的资源,例如图片。
新增主题需要基于内置主题实现,用户需提供包含 theme.plist 文件和 resources 资源文件夹的 bundle,其中 theme.plist 的 key 按需添加,缺失的 key,SDK 会从内置主题浅色资源中获取对应资源替换。
快速开始
使用内置主题
IMKit SDK 默认使用传统主题,您可以通过以下方式切换主题:
#import <RongIMKit/RongIMKit.h>
// 切换到传统主题
[RCIMKitThemeManager changeInnerTheme:RCIMKitInnerThemesTypeTradition];
// 切换到欢快主题
[RCIMKitThemeManager changeInnerTheme:RCIMKitInnerThemesTypeLively];
主题系统架构
核心类说明
RCIMKitThemeManager
主题管理器,负责主题 的切换和资源获取。
主要方法:
| 方法 | 说明 |
|---|---|
changeInnerTheme: | 切换内置主题 |
changeCustomTheme:baseOnTheme: | 应用自定义主题 |
currentInnerThemesType | 获取当前内置主题类型 |
dynamicColor:lightColor:darkColor: | 获取动态颜色 |
dynamicImage:defaultImageName: | 获取动态图片 |
addThemeDelegate: | 添加主题变更监听 |
removeThemeDelegate: | 移除主题变更监听 |
RCIMKitTheme
自定义主题类,用于加载和管理自定义主题资源。
主要属性:
| 属性 | 类型 | 说明 |
|---|---|---|
name | NSString | 主题名称 |
colors | NSDictionary | 颜色配置字典 |
images | NSDictionary | 图片配置字典 |
resourcePath | NSString | 资源文件夹路径 |
plistPath | NSString | 配置文件路径 |
RCIMKitInnerThemesType
内置主题类型枚举。
typedef NS_ENUM(NSInteger, RCIMKitInnerThemesType) {
RCIMKitInnerThemesTypeTradition, // 传统主题
RCIMKitInnerThemesTypeLively // 欢快主题
};
主题切换
使用内置主题
IMKit 提供两种内置主题:传统主题(Traditional)和欢快主题(Lively)。
切换到传统主题
#import <RongIMKit/RongIMKit.h>
// 切换到传统主题
[RCIMKitThemeManager changeInnerTheme:RCIMKitInnerThemesTypeTradition];
切换到欢快主题
// 切换到欢快主题
[RCIMKitThemeManager changeInnerTheme:RCIMKitInnerThemesTypeLively];
获取当前主题
// 获取当前内置主题类型
RCIMKitInnerThemesType currentType = [RCIMKitThemeManager currentInnerThemesType];
if (currentType == RCIMKitInnerThemesTypeTradition) {
NSLog(@"当前使用传统主题");
} else {
NSLog(@"当前使用欢快主题");
}
主题变更监听
实现 RCIMKitThemeDelegate 协议来监听主题变更:
#import <RongIMKit/RongIMKit.h>
@interface YourViewController () <RCIMKitThemeDelegate>
@end
@implementation YourViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 添加主题变更监听
[RCIMKitThemeManager addThemeDelegate:self];
}
- (void)dealloc {
// 移除主题变更监听
[RCIMKitThemeManager removeThemeDelegate:self];
}
#pragma mark - RCIMKitThemeDelegate
/// 主题变更回调
/// @param customTheme 自定义主题对象(未设置时为 nil)
/// @param type 内置主题类型
- (void)themeDidChanged:(RCIMKitTheme *)customTheme
baseOnTheme:(RCIMKitInnerThemesType)type {
NSLog(@"主题已变更:%@", type == RCIMKitInnerThemesTypeTradition ? @"传统主题" : @"欢快主题");
// 更新自定义 UI
[self updateUIForNewTheme];
}
- (void)updateUIForNewTheme {
// 刷新界面
[self.tableView reloadData];
// 更新导航栏
[self updateNavigationBar];
// 更新其他 UI 组件
// ...
}
@end
深色模式支持
IMKit 会自动适配 iOS 13+ 的系统深色模式,无需额外配置。
- iOS 13+:完整支持深色模式
- iOS 13 以下:仅支持浅色模式
自定义主题
创建自定义主题
步骤 1:准备主题资源
创建主题文件夹,包含配置文件和资源文件:
MyCustomTheme/
├── theme.plist # 主题配置文件
└── resources/ # 资源文件夹
├── icon_add@2x.png
├── icon_add@3x.png
├── icon_emoji@2x.png
├── icon_emoji@3x.png
└── ... # 其他图片资源
步骤 2:配置 theme.plist
创建 theme.plist 文件,配置颜色和图片映射:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 主题名称 -->
<key>name</key>
<string>MyCustomTheme</string>
<!-- 颜色配置 -->
<key>colors</key>
<dict>
<!-- 主色调 -->
<key>primary_color</key>
<string>#FF6B00</string>
<!-- 一级标题颜色 -->
<key>title_of_first_level_color</key>
<string>#1A1A1A</string>
<!-- 二级标题颜色 -->
<key>title_of_secondary_level_color</key>
<string>#666666</string>
<!-- 背景颜色 -->
<key>common_background_color</key>
<string>#FFFFFF</string>
<!-- 更多颜色配置... -->
</dict>
<!-- 图片配置 -->
<key>images</key>
<dict>
<!-- 输入栏添加按钮 -->
<key>conversation_input_bar_add_img</key>
<string>icon_add.png</string>
<!-- 输入栏表情按钮 -->
<key>conversation_input_bar_emoji_img</key>
<string>icon_emoji.png</string>
<!-- 更多图片配置... -->
</dict>
</dict>
</plist>
步骤 3:将主题资源添加到项目
- 将主题文件夹拖入 Xcode 项目
- 选择 "Create folder references"(创建文件夹引用)
- 确保资源文件被添加到 Target 中
步骤 4:加载并应用自定义主题
#import <RongIMKit/RongIMKit.h>
// 获取主题文件夹路径
NSString *themePath = [[NSBundle mainBundle] pathForResource:@"MyCustomTheme" ofType:nil];
// 创建自定义主题对象
RCIMKitTheme *customTheme = [[RCIMKitTheme alloc] initWithThemePath:themePath];
// 应用自定义主题(基于传统主题)
[RCIMKitThemeManager changeCustomTheme:customTheme
baseOnTheme:RCIMKitInnerThemesTypeTradition];
// 或基于欢快主题
// [RCIMKitThemeManager changeCustomTheme:customTheme
// baseOnTheme:RCIMKitInnerThemesTypeLively];
自定义主题的优先级
自定义主题的资源加载遵循以下优先级:
- 自定义主题配置:优先使用
theme.plist中配置的颜色和图片 - 内置主题配置:如果自定义主题中未配置,则使用内置主题的资源
- 颜色默认值:如果无法获取到定义的有效颜色, 则会返回透明色
示例:
// 假设自定义主题只配置了 primary_color
// 其他颜色会使用基础主题(传统或欢快)的配置
RCIMKitTheme *customTheme = [[RCIMKitTheme alloc] initWithThemePath:themePath];
[RCIMKitThemeManager changeCustomTheme:customTheme
baseOnTheme:RCIMKitInnerThemesTypeTradition];
// primary_color 使用自定义主题的配置
// 其他颜色使用传统主题的配置



