@@ -81,9 +81,6 @@ public struct MarkupStyleFont: MarkupStyleItem {
8181 if let traits = font. fontDescriptor. fontAttributes [ . traits] as? [ NSFontDescriptor . TraitKey : Any ] , let weight = traits [ . weight] as? NSFont . Weight {
8282 self = weight. convertFontWeightStyle ( )
8383 return
84- } else if font. fontDescriptor. symbolicTraits. contains ( . bold) {
85- self = . bold
86- return
8784 } else if let weightName = font. fontDescriptor. object ( forKey: . face) as? String , let weight = Self . init ( rawValue: weightName) {
8885 self = weight
8986 return
@@ -273,7 +270,7 @@ extension MarkupStyleFont {
273270 func getFont( ) -> NSFont ? {
274271 guard !isNil( ) else { return nil }
275272
276- var traits : [ NSFontDescriptor . SymbolicTraits ] = [ ]
273+ var traits : NSFontDescriptor . SymbolicTraits = [ ]
277274
278275 let size = ( self . size ?? MarkupStyle . default. font. size) ?? NSFont . systemFontSize
279276 let weight = self . weight? . convertToUIFontWeight ( ) ?? . regular
@@ -289,24 +286,15 @@ extension MarkupStyleFont {
289286 font = NSFont . systemFont ( ofSize: size, weight: weight)
290287 }
291288
292- if weight . rawValue >= NSFont . Weight . medium . rawValue {
293- traits. append ( . bold)
289+ if bold == true {
290+ traits. insert ( . bold)
294291 }
295292
296293 if let italic = self . italic, italic {
297- traits. append ( . italic)
298- }
299-
300- if traits. isEmpty {
301- return font
302- } else {
303- return withTraits ( font: font, traits: traits)
294+ traits. insert ( . italic)
304295 }
305- }
306296
307- private func withTraits( font: NSFont , traits: [ NSFontDescriptor . SymbolicTraits ] ) -> NSFont {
308- let descriptor = font. fontDescriptor. withSymbolicTraits ( NSFontDescriptor . SymbolicTraits ( traits) )
309- return NSFont ( descriptor: descriptor, size: font. pointSize) ?? font
297+ return font. with ( weight: weight, symbolicTraits: traits)
310298 }
311299}
312300
@@ -367,4 +355,26 @@ private extension NSFont.Weight {
367355 }
368356}
369357
358+ private extension NSFont {
359+
360+ /// Returns a font object that is the same as the receiver but which has the specified weight and symbolic traits
361+ func with( weight: Weight , symbolicTraits: NSFontDescriptor . SymbolicTraits ) -> NSFont {
362+
363+ var mergedsymbolicTraits = fontDescriptor. symbolicTraits
364+ mergedsymbolicTraits. formUnion ( symbolicTraits)
365+
366+ var traits = fontDescriptor. fontAttributes [ . traits] as? [ NSFontDescriptor . TraitKey : Any ] ?? [ : ]
367+ traits [ . weight] = weight
368+ traits [ . symbolic] = mergedsymbolicTraits. rawValue
369+
370+ var fontAttributes : [ NSFontDescriptor . AttributeName : Any ] = [ : ]
371+ fontAttributes [ . family] = familyName
372+ fontAttributes [ . traits] = traits
373+
374+ let font = NSFont ( descriptor: NSFontDescriptor ( fontAttributes: fontAttributes) , size: pointSize)
375+ // return UIFontMetrics.default.scaledFont(for: font)
376+ return font ?? self
377+ }
378+ }
379+
370380#endif
0 commit comments