iOS 15+适配:带动态缩放的圆角字体实现方案问询
iOS15+ 圆角动态字体解决方案
要在iOS15+实现带动态缩放的自定义字号圆角字体,可以通过结合UIKit的UIFont和UIFontMetrics来实现,完全兼容iOS15,同时满足自由控制字号、支持动态缩放、使用圆角设计的需求。
实现自定义Font扩展
创建一个SwiftUI的Font扩展,封装圆角动态字体的生成逻辑:
import SwiftUI extension Font { /// 创建支持动态缩放的圆角字体 /// - Parameters: /// - size: 基准字号(未缩放时的字号) /// - weight: 字体权重,默认常规 /// - textStyle: 动态缩放的基准文本样式,默认匹配body样式的缩放比例 static func rounded(size: CGFloat, weight: Font.Weight = .regular, textStyle: UIFont.TextStyle = .body) -> Font { // 转换SwiftUI权重为UIKit权重 let uiWeight: UIFont.Weight = { switch weight { case .ultraLight: return .ultraLight case .thin: return .thin case .light: return .light case .regular: return .regular case .medium: return .medium case .semibold: return .semibold case .bold: return .bold case .heavy: return .heavy case .black: return .black default: return .regular } }() // 创建带圆角设计的基础字体 let baseFont = UIFont.systemFont(ofSize: size, weight: uiWeight, design: .rounded) // 生成支持动态缩放的字体 let scaledFont = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: baseFont) return Font(scaledFont) } }
使用方式
直接调用自定义的rounded方法,指定基准字号和权重即可:
Text("Hello, Dynamic Rounded Font") .font(.rounded(size: 16, weight: .medium))
如果需要让字体按照特定系统文本样式的比例缩放(比如标题样式的缩放幅度),可以指定textStyle参数:
Text("Hello, Title-scaled Rounded Font") .font(.rounded(size: 20, weight: .bold, textStyle: .title1))
原理说明
UIFont.systemFont(ofSize:weight:design:):iOS13+支持,可直接创建带.rounded设计的字体;UIFontMetrics:iOS11+可用,能根据用户的系统字体大小偏好自动缩放字体,实现动态适配;- 转换为SwiftUI的
Font:通过Font(scaledFont)将UIKit字体桥接到SwiftUI,完美兼容iOS15+。
这个方案既解决了固定字号不支持缩放的问题,又摆脱了系统预设文本样式的字号限制,同时兼容iOS15及更低版本(只要不低于iOS13)。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

