iOS 8和iOS 9的系统字体

6
我希望我的应用同时支持iOS 8和iOS 9系统,甚至包括iOS 7。我们知道,iOS 7和8的系统字体是Helvetica Neue。但在iOS 9中,系统字体变为了San-Francisco。如果你不通过[UIFont fontWithName:@"HelveticaNeue" size:15];来显式设置Helvetica字体,而是使用[UIFont systemFontOfSize:15];,那么你将自动获取适用于iOS 7和8的Helvetica字体以及适用于iOS 9的San-Francisco字体。这非常方便!
对于界面构建器的标签和按钮,你可以设置薄、超薄、中等等系统字体。这也很实用。但是在代码中,我该如何以编程方式设置这些薄、超薄、中等等系统字体呢?
我需要为iOS 9创建一个新的类别吗?
4个回答

11

我创建了这个扩展:

import Foundation
import UIKit

enum SystemFontWeight : String {
    case UltraLight = "HelveticaNeue-UltraLight"
    case Thin = "HelveticaNeue-Thin"
    case Light = "HelveticaNeue-Light"
    case Regular = "HelveticaNeue"
    case Medium = "HelveticaNeue-Medium"
    case Semibold = "Helvetica-Bold"
    case Bold = "HelveticaNeue-Bold"
    case Heavy = "HelveticaNeue-CondensedBold"
    case Black = "HelveticaNeue-CondensedBlack"

    var weightValue:CGFloat? {
        if #available(iOS 8.2, *) {
            switch self {
            case .UltraLight:
                return UIFontWeightUltraLight
            case .Thin:
                return UIFontWeightThin
            case .Light:
                return UIFontWeightLight
            case .Regular:
                return UIFontWeightRegular
            case .Medium:
                return UIFontWeightMedium
            case .Semibold:
                return UIFontWeightSemibold
            case .Bold:
                return UIFontWeightBold
            case .Heavy:
                return UIFontWeightHeavy
            case .Black:
                return UIFontWeightBlack
            }
        } else {
            return nil
        }
    }
}

extension UIFont {
    static func systemFontOfSize(fontSize:CGFloat, weight:SystemFontWeight) -> UIFont {
        if #available(iOS 8.2, *) {
            return UIFont.systemFontOfSize(fontSize, weight: weight.weightValue!)

        } else {
            // Fallback on earlier versions
            return UIFont(name: weight.rawValue, size: fontSize)!
        }
    }
}

这使得可以像这样应用字体:

myLabel.font = UIFont.systemFontOfSize(14, weight: .Medium)

这将自动设置正确的字体,适用于iOS 8和iOS 9。


5

使用+ systemFontOfSize:weight:。它适用于iOS 8及以上版本。

对于iOS 7,界面构建器设置将起作用,对于代码,您需要创建具有适当字重的UIFontDescriptor


3
“+ systemFontOfSize:weight:”可在iOS 8.2及更高版本中使用。 - Valentin Shamardin
@ValentinShamardin 不用担心,这个方法从iOS 8就已经存在了。只是在8.2中作为公共API暴露出来,但你可以使用它。 - Léo Natan

2

感谢 @Leo Natan。但我想展示一段可供复制粘贴爱好者使用的代码片段。

UIFont* systemFont = [UIFont respondsToSelector:@selector(systemFontOfSize:weight:)] ? [UIFont systemFontOfSize:25 weight:UIFontWeightThin] : [UIFont  fontWithName:@"HelveticaNeue-Thin" size:25];

1
最好测试特定的功能,而不是操作系统版本。使用[UIFont respondsToSelector:@selector(systemFontOfSize:weight:)]来测试可用性。 - Léo Natan

0

感谢 @Antoine 提供了关于 Swift 的出色答案。以下是 Objective C 的类似答案,如果有人需要的话。实现 UIFont 的分类

UIFont+Cat.m

#import "UIFont+Cat.h"

@implementation UIFont (Cat)

+ (UIFont *)systemFontWithSize:(CGFloat)fontSize weight:(CGFloat)weight {
    if ([UIFont respondsToSelector:@selector(systemFontOfSize:weight:)]) {
        return [UIFont systemFontOfSize:fontSize weight:weight];
    }

    NSString *fontName = @"HelveticaNeue";
    if (weight == UIFontWeightUltraLight) {
        fontName = @"HelveticaNeue-UltraLight";
    }
    else if (weight == UIFontWeightThin) {
        fontName = @"HelveticaNeue-Thin";
    }
    else if (weight == UIFontWeightLight) {
        fontName = @"HelveticaNeue-Light";
    }
    else if (weight == UIFontWeightRegular) {
        fontName = @"HelveticaNeue";
    }
    else if (weight == UIFontWeightMedium) {
        fontName = @"HelveticaNeue-Medium";
    }
    else if (weight == UIFontWeightSemibold) {
        fontName = @"Helvetica-Bold";
    }
    else if (weight == UIFontWeightBold) {
        fontName = @"HelveticaNeue-Bold";
    }
    else if (weight == UIFontWeightHeavy) {
        fontName = @"HelveticaNeue-CondensedBold";
    }
    else if (weight == UIFontWeightBlack) {
        fontName = @"HelveticaNeue-CondensedBlack";
    }

    return [UIFont fontWithName:fontName size:fontSize];
}

@end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接