自动使用自定义阿拉伯文/西里尔文字体的iOS

自动使用自定义阿拉伯文/西里尔文字体的iOS,ios,swift,xcode,fonts,internationalization,Ios,Swift,Xcode,Fonts,Internationalization,我正在尝试了解是否可以使用自定义的阿拉伯语和西里尔文字体,而无需在用户的语言设置上进行切换/if-else 我可以在应用程序中成功使用自定义字体。我想以同样的方式提供自定义Ar/Cy字体,我知道我可以将其构建到应用程序中。如果我有我的字体SpecialFont.otf并且还提供SpecialFont-CY.otf当用户使用西里尔语时,操作系统如何知道使用SpecialFont.otf?理想情况下,操作系统将知道用户的主要字体,并能够选择与该语言匹配/包含正确字形的字体 这不是一个关于如何使用自定

我正在尝试了解是否可以使用自定义的阿拉伯语和西里尔文字体,而无需在用户的语言设置上进行
切换/if-else

我可以在应用程序中成功使用自定义字体。我想以同样的方式提供自定义Ar/Cy字体,我知道我可以将其构建到应用程序中。如果我有我的字体
SpecialFont.otf
并且还提供
SpecialFont-CY.otf
当用户使用西里尔语时,操作系统如何知道使用SpecialFont.otf?理想情况下,操作系统将知道用户的主要字体,并能够选择与该语言匹配/包含正确字形的字体

这不是一个关于如何使用自定义字体的问题,我可以这样做。我想知道如何为各种语言提供多种字体,以完全支持世界,而无需编写如下代码:


您需要以某种方式对此进行检查,以确定要设置的正确语言

如果不想使用
If/else
语法,可以使用三元条件运算符

let myFont=(NSLocale.preferredLanguages.first=“阿拉伯语”)?UIFont(名称:“SpecialFont AR”,大小:17):UIFont(名称:“SpecialFont CY”,大小:17)
或者更具可读性,如下所示:

let fontName=(NSLocale.preferredLanguages.first=“阿拉伯语”)?“SpecialFont AR”:“SpecialFont CY”
让myFont=UIFont(名称:fontName,大小:17)

您需要以某种方式对此进行检查,以确定要设置的正确语言

如果不想使用
If/else
语法,可以使用三元条件运算符

let myFont=(NSLocale.preferredLanguages.first=“阿拉伯语”)?UIFont(名称:“SpecialFont AR”,大小:17):UIFont(名称:“SpecialFont CY”,大小:17)
或者更具可读性,如下所示:

let fontName=(NSLocale.preferredLanguages.first=“阿拉伯语”)?“SpecialFont AR”:“SpecialFont CY”
让myFont=UIFont(名称:fontName,大小:17)

不可以,但可以为代码定义一个简单的扩展:

extension UIFont {
    static func preferred(ofSize size: CGFloat) -> UIFont{
        switch NSLocale.preferredLanguages.first {
        case "Arabic": return UIFont(name:"SpecialFont-AR", size: size)!
        case "Russian": return UIFont(name:"SpecialFont-CY", size: size)!
        default: return UIFont.systemFont(ofSize: size) // etc.
        }
    }
}
现在你所要做的就是:

let myFont = UIFont.preferred(ofSize: 17)

不,您不能,但您可以为代码定义一个简单的扩展:

extension UIFont {
    static func preferred(ofSize size: CGFloat) -> UIFont{
        switch NSLocale.preferredLanguages.first {
        case "Arabic": return UIFont(name:"SpecialFont-AR", size: size)!
        case "Russian": return UIFont(name:"SpecialFont-CY", size: size)!
        default: return UIFont.systemFont(ofSize: size) // etc.
        }
    }
}
现在你所要做的就是:

let myFont = UIFont.preferred(ofSize: 17)

您需要的不是UIFont,而是UIFontDescriptor。这样,您可以设置字体属性
cascadeList
,它告诉系统根据字形可用性选择字体的顺序(即,在SpecialFont中查找,但如果找不到ب的字形,请尝试SpecialFont CY,然后是SpecialFont AR)

级联列表的要点是为给定的字形选择正确的字体。这样,如果字符串包含西里尔语、阿拉伯语和拉丁语混合在一起,它仍然可以正常工作

例如:

// Start with your base font
let font = UIFont(name:"SpecialFont", size: 17)!

// Create the ordered cascade list.
let cascadeList = [
    UIFontDescriptor(fontAttributes: [.name: "SpecialFont-AR"]),
    UIFontDescriptor(fontAttributes: [.name: "SpecialFont-CY"]),
]

// Create a new font descriptor based on your existing font, but adding the cascade list
let cascadedFontDescriptor = font.fontDescriptor.addingAttributes([.cascadeList: cascadeList])

// Make a new font base on this descriptor
let cascadedFont = UIFont(descriptor: cascadedFontDescriptor, size: font.pointSize)

(WWDC 2018)详细介绍了这一点。

您需要的不是UIFont,而是UIFontDescriptor。这样,您可以设置字体属性
cascadeList
,它告诉系统根据字形可用性选择字体的顺序(即,在SpecialFont中查找,但如果找不到ب的字形,请尝试SpecialFont CY,然后是SpecialFont AR)

级联列表的要点是为给定的字形选择正确的字体。这样,如果字符串包含西里尔语、阿拉伯语和拉丁语混合在一起,它仍然可以正常工作

例如:

// Start with your base font
let font = UIFont(name:"SpecialFont", size: 17)!

// Create the ordered cascade list.
let cascadeList = [
    UIFontDescriptor(fontAttributes: [.name: "SpecialFont-AR"]),
    UIFontDescriptor(fontAttributes: [.name: "SpecialFont-CY"]),
]

// Create a new font descriptor based on your existing font, but adding the cascade list
let cascadedFontDescriptor = font.fontDescriptor.addingAttributes([.cascadeList: cascadeList])

// Make a new font base on this descriptor
let cascadedFont = UIFont(descriptor: cascadedFontDescriptor, size: font.pointSize)

这在(WWDC 2018)中有详细介绍。

完美,正是我想要的!非常感谢。完美,正是我想要的!非常感谢。