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

SwiftUI中自定义字体与dynamicTypeSize兼容及符号显示异常问题

问题解决指南

一、自定义字体与动态类型的正确兼容方式

你之前尝试把relativeTo的参数换成.xxLarge是错误的,因为relativeTo需要接收文本样式(Font.TextStyle),比如.body、.title,而.dynamicTypeSize是用来限制动态类型的可用范围,两者配合使用才能实现自定义字体的动态缩放:

正确写法示例:

  1. 基于系统文本样式的相对缩放
Text("Hello, World")
    .font(Font.custom("AmericanTypewriter", relativeTo: .title))
    .dynamicTypeSize(.small ... .xxxLarge) // 限制允许的动态尺寸范围
  1. 固定基础字号同时支持动态缩放
Text("Hello, World")
    .font(Font.custom("AmericanTypewriter", size: 18, relativeTo: .body))
    .dynamicTypeSize(.medium ... .xxLarge)

这样字体既保留自定义样式,又能跟随系统动态类型设置自动调整大小。

二、解决逻辑符号显示大小不一致的问题

∧(U+2229)和∨(U+222A)在AmericanTypewriter字体中的字形设计尺寸不同,导致视觉大小差异,以下是几种可行的解决方法:

方法1:固定容器+自适应缩放

通过固定文本容器大小,让字符自动缩放适配,确保视觉一致:

Text(etLogique ? ET : OU)
    .font(.custom("AmericanTypewriter", size: 18, relativeTo: .body))
    .bold()
    .scaledToFit()
    .frame(width: 24, height: 24) // 可根据需求调整容器尺寸
    .pastille(color: Color("fondbleu"))
    .onTapGesture {
        etLogique.toggle()
    }

方法2:强制等宽排版

使用.fontDesign(.monospaced)让字体以等宽方式渲染,统一字符宽度:

Text(etLogique ? ET : OU)
    .font(.custom("AmericanTypewriter", size: 18, relativeTo: .body)
            .fontDesign(.monospaced))
    .bold()
    .pastille(color: Color("fondbleu"))
    .onTapGesture {
        etLogique.toggle()
    }

方法3:手动调整特定字符缩放

针对尺寸偏小的∧符号单独放大,匹配∨的视觉大小:

Text(etLogique ? ET : OU)
    .font(.custom("AmericanTypewriter", size: 18))
    .bold()
    .scaleEffect(etLogique ? 1.2 : 1.0) // 缩放比例可根据实际显示效果调整
    .pastille(color: Color("fondbleu"))
    .onTapGesture {
        etLogique.toggle()
    }

内容的提问来源于stack exchange,提问作者Simon W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:54:52