10

System Medium在情节提要上设置了这样的字体:

在此处输入图像描述

这是结果iOS 8

在此处输入图像描述

但是iOS 7显示了不同的(奇怪的)字体:

在此处输入图像描述

我设置错了吗?

4

3 回答 3

8

也在这个问题上运行,这是我的发现。这是一个真正的混乱。

iOS7 上没有 Medium 系统字体,他们在 iOS 8.2 中添加了它。在 iOS7 上,经过长时间的滞后,它正在按字母顺序选择第一个字体(Academy Engraved)。

有趣的是,iOS 7 的粗体系统字体实际上是 Medium Helvetica Neue 字体:

(lldb) po [UIFont boldSystemFontOfSize:12]
<UICTFont: 0x12c58f8b0> font-family: ".HelveticaNeueInterface-MediumP4"; font-weight: bold; font-style: normal; font-size: 12.00pt

systemFont 是常规的 Helvetica Neue。

iOS 7 的解决方法是在 interface builder 中选择 System Bold 字体,它在 iOS7 设备上运行时确实比在 interface builder 上运行时看起来更薄。不幸的是,在 iOS8 和 iOS9 上,它看起来真的很大胆而不是中等......

对于这些情况,我最终切换到 Helvetica-Neue Medium,不幸的是,这意味着我在 iOS 9 上的某些屏幕上的系统字体/San Francisco 和 Helvetica-Neue 不匹配。迫不及待地想要获得绿灯放弃支持适用于 iOS7。

于 2015-09-22T21:59:21.693 回答
4

我使用方法 swizzling 来修复这个 iOS 7 错误。我的方法适用于 Interface Builder。

UIFont+Swizzling.h

@import UIKit;

@interface UIFont (UIFont_Swizzle)

@end

UIFont+Swizzling.m

#import "UIFont+Swizzle.h"

@import ObjectiveC.runtime;

@implementation UIFont (UIFont_Swizzle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if ([NSProcessInfo instancesRespondToSelector:@selector(operatingSystemVersion)]) return;
        Class class = object_getClass((id)self);

        SEL originalSelector = @selector(fontWithDescriptor:size:);
        SEL swizzledSelector = @selector(swizzled_fontWithDescriptor:size:);

        Method originalMethod = class_getClassMethod(class, originalSelector);
        Method swizzledMethod = class_getClassMethod(class, swizzledSelector);

        BOOL didAddMethod = class_addMethod(class,
                                            originalSelector,
                                            method_getImplementation(swizzledMethod),
                                            method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

+ (UIFont *)swizzled_fontWithDescriptor:(UIFontDescriptor *)descriptor size:(CGFloat)pointSize {
    id usageAttribute = descriptor.fontAttributes[@"NSCTFontUIUsageAttribute"];

    if (!descriptor.fontAttributes[UIFontDescriptorNameAttribute] &&
        [usageAttribute isKindOfClass:[NSString class]] &&
        [usageAttribute isEqualToString:@"CTFontMediumUsage"]) {
        descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorNameAttribute: @"HelveticaNeue-Medium"}];
    }
    id font = [self swizzled_fontWithDescriptor:descriptor size:pointSize];

    return font;
}

@end

特别感谢Xtrace的创建者 :)

于 2016-08-05T11:33:15.117 回答
0

检查版本号,如果它小于 8,则在 viewDidLoad 中以编程方式更改字体:

if !NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
    //change font
}
于 2015-09-22T22:31:37.070 回答