swift - 使用符号特征从 *light* 字体创建斜体版本
问题描述
我想要一个浅色字体的斜体版本,例如“HelveticaNeue-Light”。
使用 afontDescriptor
给了我“常规”“Helvetica Neue”的斜体版本,而不是斜体“HelveticaNeue-Light”。我可以检索fontDescriptor.fontAttributes
并更新UIFontDescriptor.AttributeName.name
,但这很棘手,因为每种字体的命名不同(“HelveticaNeue”使用“Italic”,Helvetica 使用“Oblique”)。
let lightFont = UIFont(name: "HelveticaNeue-Light", size: 16.0)!
var lightFontDescriptor = lightFont.fontDescriptor.withSymbolicTraits([.traitItalic])!
var lightFontWithItalicTraits = UIFont(descriptor: lightFontDescriptor, size: 0)
// <UICTFont: ..> font-family: "HelveticaNeue-Light"; font-weight: normal; font-style: normal; font-size: 16.00pt
print(lightFont)
// <UICTFont: ..> font-family: "Helvetica Neue"; font-weight: normal; font-style: italic; font-size: 16.00pt
print(lightFontWithItalicTraits)
// The font I expect:
let lightItalicFont = UIFont(name: "HelveticaNeue-LightItalic", size: 16.0)!
// <UICTFont: ..> font-family: "HelveticaNeue-LightItalic"; font-weight: normal; font-style: italic; font-size: 16.00pt
print(lightItalicFont)
任何其他想法如何获得现有字体的斜体版本?
解决方案
它不是最漂亮的,但它很实用。它处理所有内置的 iOS 字体。
延期:
extension UIFont {
func italic() -> UIFont? {
if let italic = UIFont.init(name: "\(self.fontName)-Italic", size: self.pointSize) {
return italic
} else if let italic = UIFont.init(name: "\(self.fontName)Italic", size: self.pointSize) {
return italic
}
if let oblique = UIFont.init(name: "\(self.fontName)-Oblique", size: self.pointSize) {
return oblique
} else if let oblique = UIFont.init(name: "\(self.fontName)Oblique", size: self.pointSize) {
return oblique
}
var suffixFontName = self.fontName // for font names that have a 2 letter suffix such as ArialMT
suffixFontName.removeLast(2)
let suffix = self.fontName.suffix(2)
if let suffixFontName = UIFont.init(name: "\(suffixFontName)-Italic\(suffix)", size: self.pointSize) {
return suffixFontName
}
if let suffixFontName = UIFont.init(name: "\(suffixFontName)Italic\(suffix)", size: self.pointSize) {
return suffixFontName
}
// no italic, oblique, or mt italic font found
return nil
}
}
用法:
let helveticaNeueLightItalic = UIFont(name: "HelveticaNeue-Light", size: 16.0)!.italic()
print(helveticaNeueLightItalic)
let helveticaItalic = UIFont(name: "Helvetica", size: 16.0)!.italic()
print(helveticaItalic)
let helveticaLightItalic = UIFont(name: "Helvetica-Light", size: 16.0)!.italic()
print(helveticaLightItalic)
let arialMtItalic = UIFont(name: "ArialMT", size: 16.0)!.italic()
print(arialMtItalic)
let arialMtBoldItalic = UIFont(name: "Arial-BoldMT", size: 16.0)!.italic()
print(arialMtBoldItalic)
推荐阅读
- javascript - Firestore OR 查询
- reactjs - 正确的类型将道具传递给反应打字稿中的孩子。错误 ts(2322)
- java - java中的加权随机选择?
- python - 如何将 Numpy 维度数组 (3, 2998, 2403) 转换为 (2998, 2403, 3)?
- c# - 摆脱典型的 Android 栏 (Action bar) Xamarin
- jsf - 带有多个选项卡的 JSF
- javascript - 如何从使用javascript检查的复选框中获取值?
- mysql - 从不同的选择中添加额外的行
- python - 使用 Python 创建表并插入到 SQL Server
- node.js - 错误 [FirebaseError]:文档引用无效。文档引用必须有偶数个段,