Код: Выделить всё
import SwiftUI
extension Font {
private static var referenceWidth: CGFloat { 393 } // iPhone 14/15 Pro width (pt)
private static var minScale: CGFloat { 0.45 }
private static var maxScale: CGFloat { 0.85 }
private static func scale(forBaseSize baseSize: CGFloat) -> CGFloat {
let screenWidth = UIScreen.main.bounds.width
let rawScale = screenWidth / referenceWidth
let clampedScale = max(minScale, min(rawScale, maxScale))
return baseSize * clampedScale
}
private static func customScaled(_ name: String, baseSize: CGFloat, relativeTo textStyle: Font.TextStyle = .body) -> Font {
let scaledSize = scale(forBaseSize: baseSize)
// Use `relativeTo:` so Dynamic Type (Accessibility) is respected
return .custom(name, size: scaledSize, relativeTo: textStyle)
}
static func responsiveSFComRegular(size: CGFloat, relativeTo textStyle: Font.TextStyle = .body) -> Font {
customScaled("SFProRounded-Regular", baseSize: size, relativeTo: textStyle)
}
static func responsiveSFComSemibold(size: CGFloat, relativeTo textStyle: Font.TextStyle = .body) -> Font {
customScaled("SFProRounded-Semibold", baseSize: size, relativeTo: textStyle)
}
static func responsiveSFComBold(size: CGFloat, relativeTo textStyle: Font.TextStyle = .body) -> Font {
customScaled("SFProRounded-Bold", baseSize: size, relativeTo: textStyle)
}
static func responsiveSFComMedium(size: CGFloat, relativeTo textStyle: Font.TextStyle = .body) -> Font {
customScaled("SFProRounded-Medium", baseSize: size, relativeTo: textStyle)
}
}
Это хороший способ сделать шрифты динамическими в SwiftUI в зависимости от размера устройства?
Используется ли referenceWidth, например 393, для безопасного масштабирования, или это может вызвать проблемы на маленьких/больших устройствах?
Я также использую относительныйTo: textStyle — конфликтует ли это с масштабированием на основе устройства?
Есть ли лучшие шаблоны для обеспечения адаптивности шрифтов в SwiftUI?
Подробнее здесь: https://stackoverflow.com/questions/797 ... in-swiftui
Мобильная версия