iOS - 如何为自定义字体设置后备字体?

时间:2014-01-23 04:24:20

标签: ios iphone objective-c localization

我正在为我的应用的导航栏标题使用粗体自定义字体。

我也刚刚对我的应用进行了本地化对于字体不支持的语言(主要是亚洲语言),iOS可以回退到系统默认值 - 唉,这不是一个大胆的系统默认值,而是一个不适合标题的标准权重。

我该怎么做才能改变这个?

5 个答案:

答案 0 :(得分:2)

回答赏金问题

这是一个扩展,允许使用将应用于拉丁字符的第二组属性构造NSAttributedString:

extension String {
    private var englishRanges: [NSRange] {
        let set = NSMutableCharacterSet(range: NSRange(location: 0x0041, length: 26))
        set.addCharactersInRange(NSRange(location: 0x0061, length: 26))
        var start = startIndex
        var englishRanges = [Range<String.Index>]()
        while let range = rangeOfCharacterFromSet(set, options: [], range: start..<endIndex) {
            start = range.endIndex
            englishRanges.append(range)
        }
        return englishRanges.map {NSRange(location: startIndex.distanceTo($0.startIndex), length: $0.count)}
    }

    func attributedMultilanguageString(options: [String:AnyObject], englishOptions:[String:AnyObject]) -> NSAttributedString {
        let string = NSMutableAttributedString(string: self, attributes: options)
        englishRanges.forEach {
            string.setAttributes(englishOptions, range: $0)
        }
        return string
    }
}

使用示例:

let font = UIFont(name: "Arial-BoldMT", size: 18.0)!
let englishFont = UIFont(name: "Chalkduster", size: 18.0)!
let label = UILabel()
label.attributedText = "some string 111".attributedMultilanguageString([ NSFontAttributeName: font], englishOptions: [ NSFontAttributeName: englishFont])

第二种方法

此扩展程序允许您指定后备字体,而不是使用特定字符的第二种字体:

extension String {
    private func unsupportedCharacterIndexes(font: String) -> [String.Index] {
        let font = CGFontCreateWithFontName(font)
        return characters.indices.filter {CGFontGetGlyphWithGlyphName(font, String(self[$0])) == 0}
    }

    func attributedString(fontName: String, fallbackFontName: String, fontSize: CGFloat, options: [String:AnyObject]? = nil) -> NSAttributedString {
        var options = options ?? [String:AnyObject]()
        options[NSFontAttributeName] = UIFont(name: fontName, size: fontSize)
        let string = NSMutableAttributedString(string: self, attributes: options)
        options[NSFontAttributeName] = UIFont(name: fallbackFontName, size: fontSize)
        unsupportedCharacterIndexes(fontName).forEach {
            string.setAttributes(options, range: NSRange(location: startIndex.distanceTo($0), length: 1))
        }
        return string
    }
}

使用示例:

let label = UILabel()
label.attributedText = "some текст".attributedString("Chalkduster", fallbackFontName: "Baskerville-SemiBoldItalic", fontSize: 18)

答案 1 :(得分:1)

function escape_string($data)
{
    $result =   array();

    if(is_array($data)){
        foreach($data as $row){
            $utf_data =  mb_convert_encoding(str_replace('"', '',trim($row)), 'UTF-8', 'UTF-8');
            $result[]   = str_ireplace('?', '', $utf_data);
        }
    }else{
        //return utf8_encode(str_replace('"', '',trim($data)));
        $utf_data =  mb_convert_encoding(str_replace('"', '',trim($data)), 'UTF-8', 'UTF-8');
        return str_ireplace('?', '', $utf_data);
    }
    return $result;
}

将“Helvetica Neue”更改为您想要退回的任何fontName,您将获得一个后备字体。

答案 2 :(得分:0)

我不确定这是否是最佳方式,但我使用以下代码段检查特定语言:

//store all fallback languages in this array (eg.: el = greek, ru = russian)
NSArray *fallbackFont = @[@"el", @"ru"];
NSString *lang = [[NSLocale preferredLanguages] objectAtIndex:0]
BOOL hasFallbackFont = [fallbackFont containsObject:lang];

NSString *fontNameBold = hasFallbackFont ? @"Fallback-Font-Bold" : @"Regular-Font-Bold";

...

myLabel.font = [UIFont fontWithName:fontNameBold size:12.0];

答案 3 :(得分:0)

如果不支持该语言,基本当然是定期更换自定义字体。换句话说,挑战是要确定是否支持所讨论的语言。

不是最性感的解决方案,但我相信它应该有效:

  • 将您的字体转换为CGFontRef。 CGFontRef cgFontVersion = CGFontCreateWithFontName((CFStringRef)uiFont.fontName);
  • 对包含您计划支持的每种语言的必要字形的数组使用CGFontGetGlyphWithGlyphName。*
  • 如果CGFontGetGlyphWithGlyphName返回0,则不支持您的自定义字体,您可以使用您想要的任何后备字体。

*掌握这些可能是最困难的部分,很好的部分,因为你只需要这样做一次,并可以再次使用它为未来的项目......

一个更实用的解决方案是做一些像Hannes建议的那样,但是你需要为你决定在将来使用的每个新自定义字体手动为每种语言重做它。

答案 4 :(得分:-1)

请确保您希望显示所需的字体为默认字体,而不是系统默认字体。但是,类似于所需的字体,默认。

IF (1=1)
BEGIN
END

这确保我们始终使用字体。现在,您可以从这里了解如何将字体及其样式设置为首选视图/控件。

应该这样做。请告诉我们它是如何适合你的!