SwiftUI中自定义字体与dynamicTypeSize兼容及符号显示异常问题
问题解决指南
一、自定义字体与动态类型的正确兼容方式
你之前尝试把relativeTo的参数换成.xxLarge是错误的,因为relativeTo需要接收文本样式(Font.TextStyle),比如.body、.title,而.dynamicTypeSize是用来限制动态类型的可用范围,两者配合使用才能实现自定义字体的动态缩放:
正确写法示例:
- 基于系统文本样式的相对缩放
Text("Hello, World") .font(Font.custom("AmericanTypewriter", relativeTo: .title)) .dynamicTypeSize(.small ... .xxxLarge) // 限制允许的动态尺寸范围
- 固定基础字号同时支持动态缩放
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
相关产品推荐
相关产品推荐

