@@ -8,15 +8,15 @@ extension MarkdownStyle {
88 public struct Font : Hashable {
99 private var provider : AnyHashable
1010
11- func resolve( ) -> PlatformFont {
11+ func resolve( sizeCategory : ContentSizeCategory = . large ) -> PlatformFont {
1212 guard let fontProvider = self . provider. base as? FontProvider else {
1313 fatalError ( " provider should conform to FontProvider " )
1414 }
1515 #if os(macOS)
16- return . init( descriptor: fontProvider. fontDescriptor ( ) , size: 0 )
16+ return . init( descriptor: fontProvider. fontDescriptor ( compatibleWith : sizeCategory ) , size: 0 )
1717 ?? . preferredFont( forTextStyle: . body)
1818 #elseif os(iOS) || os(tvOS)
19- return . init( descriptor: fontProvider. fontDescriptor ( ) , size: 0 )
19+ return . init( descriptor: fontProvider. fontDescriptor ( compatibleWith : sizeCategory ) , size: 0 )
2020 #endif
2121 }
2222 }
@@ -150,21 +150,22 @@ extension MarkdownStyle.Font {
150150// MARK: - FontProvider
151151
152152private protocol FontProvider {
153- func fontDescriptor( ) -> PlatformFontDescriptor
153+ func fontDescriptor( compatibleWith sizeCategory : ContentSizeCategory ) -> PlatformFontDescriptor
154154}
155155
156156private struct TextStyleFontProvider : Hashable , FontProvider {
157157 var style : SwiftUI . Font . TextStyle
158158 var design : SwiftUI . Font . Design
159159
160- func fontDescriptor( ) -> PlatformFontDescriptor {
160+ func fontDescriptor( compatibleWith sizeCategory : ContentSizeCategory ) -> PlatformFontDescriptor {
161161 #if os(macOS)
162162 let fontDescriptor = PlatformFontDescriptor . preferredFontDescriptor (
163163 forTextStyle: . init( style)
164164 )
165165 #elseif os(iOS) || os(tvOS)
166166 let fontDescriptor = PlatformFontDescriptor . preferredFontDescriptor (
167- withTextStyle: . init( style)
167+ withTextStyle: . init( style) ,
168+ compatibleWith: . init( preferredContentSizeCategory: . init( sizeCategory) )
168169 )
169170 #endif
170171
@@ -177,7 +178,7 @@ private struct SystemFontProvider: Hashable, FontProvider {
177178 var weight : SwiftUI . Font . Weight
178179 var design : SwiftUI . Font . Design
179180
180- func fontDescriptor( ) -> PlatformFontDescriptor {
181+ func fontDescriptor( compatibleWith _ : ContentSizeCategory ) -> PlatformFontDescriptor {
181182 let fontDescriptor = PlatformFont . systemFont ( ofSize: size, weight: . init( weight) )
182183 . fontDescriptor
183184 return fontDescriptor. withDesign ( . init( design) ) ?? fontDescriptor
@@ -189,12 +190,16 @@ private struct CustomFontProvider: Hashable, FontProvider {
189190 var size : CGFloat
190191 var textStyle : SwiftUI . Font . TextStyle ?
191192
192- func fontDescriptor( ) -> PlatformFontDescriptor {
193+ func fontDescriptor( compatibleWith sizeCategory : ContentSizeCategory ) -> PlatformFontDescriptor {
193194 var size = self . size
194195
195196 #if os(iOS) || os(tvOS)
196197 if let textStyle = self . textStyle {
197- size = UIFontMetrics ( forTextStyle: . init( textStyle) ) . scaledValue ( for: size)
198+ size = UIFontMetrics ( forTextStyle: . init( textStyle) )
199+ . scaledValue (
200+ for: size,
201+ compatibleWith: . init( preferredContentSizeCategory: . init( sizeCategory) )
202+ )
198203 }
199204 #endif
200205
@@ -211,11 +216,11 @@ private struct FontModifierProvider<M>: Hashable, FontProvider where M: Hashable
211216 var base : AnyHashable
212217 var modifier : M
213218
214- func fontDescriptor( ) -> PlatformFontDescriptor {
219+ func fontDescriptor( compatibleWith sizeCategory : ContentSizeCategory ) -> PlatformFontDescriptor {
215220 guard let fontProvider = self . base. base as? FontProvider else {
216221 fatalError ( " base should conform to FontProvider " )
217222 }
218- var fontDescriptor = fontProvider. fontDescriptor ( )
223+ var fontDescriptor = fontProvider. fontDescriptor ( compatibleWith : sizeCategory )
219224 modifier. modify ( & fontDescriptor)
220225 return fontDescriptor
221226 }
@@ -399,3 +404,38 @@ extension PlatformFontDescriptor.SystemDesign {
399404 }
400405 }
401406}
407+
408+ #if os(iOS) || os(tvOS)
409+ extension UIContentSizeCategory {
410+ fileprivate init ( _ contentSizeCategory: ContentSizeCategory ) {
411+ switch contentSizeCategory {
412+ case . extraSmall:
413+ self = . extraSmall
414+ case . small:
415+ self = . small
416+ case . medium:
417+ self = . medium
418+ case . large:
419+ self = . large
420+ case . extraLarge:
421+ self = . extraLarge
422+ case . extraExtraLarge:
423+ self = . extraExtraLarge
424+ case . extraExtraExtraLarge:
425+ self = . extraExtraExtraLarge
426+ case . accessibilityMedium:
427+ self = . accessibilityMedium
428+ case . accessibilityLarge:
429+ self = . accessibilityLarge
430+ case . accessibilityExtraLarge:
431+ self = . accessibilityExtraLarge
432+ case . accessibilityExtraExtraLarge:
433+ self = . accessibilityExtraExtraLarge
434+ case . accessibilityExtraExtraExtraLarge:
435+ self = . accessibilityExtraExtraExtraLarge
436+ @unknown default :
437+ self = . large
438+ }
439+ }
440+ }
441+ #endif
0 commit comments