# Uni-FontSync **Repository Path**: lixin-git/uni-fontSync ## Basic Information - **Project Name**: Uni-FontSync - **Description**: 一个基于 UTS 的 uni-app 示例工程,通过原生能力读取 Android 与 iOS 的系统字体设置,并在应用内按照系统字体大小(或缩放比例)动态调整文字显示。由于 uni-app 默认隔离了系统字体大小,本项目以 UTS 插件方式进行绕过与适配。 - **Primary Language**: JavaScript - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-16 - **Last Updated**: 2025-12-23 ## Categories & Tags **Categories**: uniapp **Tags**: None ## README 根据手机字体设置页面字体(uni-app + UTS 插件) 一个基于 UTS 的 uni-app 示例工程,通过原生能力读取 Android 与 iOS 的系统字体设置,并在应用内按照系统字体大小(或缩放比例)动态调整文字显示。由于 uni-app 默认隔离了系统字体大小,本项目以 UTS 插件方式进行绕过与适配。

展示页预览

## 功能概览 - Android:读取 `Configuration.fontScale` 获取系统字体缩放比例(如 `1.0`, `1.1`) - iOS:读取 `UIFont.preferredFont(forTextStyle: .body)` 的 `pointSize` 获取当前系统标准正文字体大小(如 `17.0`, `19.0`) - 全局混入:将读取到的值注入到页面 `data` 中,并提供方法在页面展示时进行计算和应用 - 页面示例:根据系统设置动态计算文字大小并应用到 `text` 组件的 `style` ## 目录结构 ``` 项目根/ common/ font-scale-mixin.js # 全局混入:读取系统字体并存储到 data pages/ index/ index.vue # 示例页面:按钮触发与动态字体大小展示 uni_modules/ uni-get-system-text-size/ utssdk/ interface.uts # 插件接口定义(类型与默认实现) app-android/index.uts # Android 原生实现:返回 fontScale app-ios/index.uts # iOS 原生实现:返回 pointSize package.json # 插件元信息 main.js # 注入全局混入 App.vue # 应用生命周期钩子 manifest.json / pages.json # 标准 uni-app 配置文件 ``` ## 原理说明 - Android:通过 `Resources.getConfiguration().fontScale` 获取系统字体缩放,`1.0` 为标准字号,`>1.0` 表示大字号,`<1.0` 表示小字号(`uni_modules/uni-get-system-text-size/utssdk/app-android/index.uts:7`)。 - iOS:通过 `UIFont.preferredFont(forTextStyle: .body)` 获取系统当前“正文字体”的点大小,标准通常为 `17.0`(`uni_modules/uni-get-system-text-size/utssdk/app-ios/index.uts:4`)。 - 页面应用:将获取到的数值与默认基准字体叠加,得到最终显示的像素值并应用到组件样式。 ## 使用方法 1) 引入插件与全局混入 - 在 `main.js` 中全局注入混入(`main.js:5`–`main.js:7`),混入会在页面展示时读取系统字体并写入 `fontSizeVal`(`common/font-scale-mixin.js:34`–`common/font-scale-mixin.js:37`)。 ```js import FontScaleMixin from './common/font-scale-mixin'; Vue.mixin(FontScaleMixin); ``` 2) 页面示例 - 在页面中使用计算属性,将系统值转换为最终字号,绑定到样式(`pages/index/index.vue:20`–`pages/index/index.vue:25`)。 ```vue 当前值: {{ fontSizeVal }} ``` 3) 同步获取与平台判断 - 混入中调用同步方法 `getSystemFontSize()`(`common/font-scale-mixin.js:16`),并用条件编译宏判断平台(`common/font-scale-mixin.js:21`, `common/font-scale-mixin.js:27`)。 ## 字体缩放归一化建议 当前实现返回值含义在两端不同: - Android 返回缩放比例(例如 `1.1`) - iOS 返回绝对点大小(例如 `19.0`) 为便于统一计算,建议在页面层进行归一化为“缩放比例”: ```js // 归一化为 scale:Android 直接使用,iOS 以 17 为基准点 const DEFAULT_IOS_BASE = 17; const size = getSystemFontSize(); // #ifdef APP-ANDROID const scale = size; // 已是比例 // #endif // #ifdef APP-IOS const scale = size / DEFAULT_IOS_BASE; // #endif const baseFontPx = 17; // 你的设计基准字号 const computedFontSize = scale * baseFontPx; ``` 如需全局统一,可将归一化逻辑放入混入或封装为工具函数,避免每个页面重复。 ## 关键代码位置 - 插件接口与默认实现:`uni_modules/uni-get-system-text-size/utssdk/interface.uts:10` - Android 实现(返回 `fontScale`):`uni_modules/uni-get-system-text-size/utssdk/app-android/index.uts:7` - iOS 实现(返回 `pointSize`):`uni_modules/uni-get-system-text-size/utssdk/app-ios/index.uts:4` - 全局混入注入:`main.js:5` - 读取系统字体并写入 `fontSizeVal`:`common/font-scale-mixin.js:16`、`common/font-scale-mixin.js:18` - 页面绑定与显示:`pages/index/index.vue:3`、`pages/index/index.vue:4`、`pages/index/index.vue:20` ## 运行与打包 - 推荐使用 HBuilderX 打开本项目,选择 App 平台运行(Android/iOS)。 - UTS 代码由 HBuilderX 在构建期编译为目标平台字节码/原生代码(参考 `unpackage/` 下的编译产物)。 ## 注意事项 - 不同设备与系统版本的“基准字号”可能有所差异,iOS 以 `.body` 的标准点大小为准,通常为 `17.0`。 - 若你的设计基准字号不是 `17px`,请在归一化时调整 `DEFAULT_IOS_BASE` 与 `baseFontPx`。 - 页面初次展示时即可读取系统值;若用户在系统设置中修改字体大小,需在应用前后台切换或页面重新展示时重新获取(可在 `onShow` 重试)。 - 条件编译宏 `#ifdef APP-ANDROID` / `#ifdef APP-IOS` 仅在对应平台打包时生效。 ## 后续扩展 - 将归一化 scale 注入到 CSS 变量,统一控制全局字号与间距: 例如在根节点维护 `--font-scale`,各组件字号均以该比例计算。 - 监听系统设置变化(如可能):通过原生层回调通知 JS 刷新 UI。 - 提供更多文本样式适配:字重、行高、间距随 scale 协同调整。