Разный шрифт System Medium на iOS 7

Я устанавливаю шрифт System Medium в раскадровке следующим образом:

введите описание изображения здесь

И это результат для iOS 8:

введите описание изображения здесь

Но iOS 7 показывает другой (странный) шрифт:

введите описание изображения здесь

Я устанавливаю что-то неправильно?

Ответ 1

Запуск по этой проблеме, и это мои выводы. Это настоящий беспорядок.

Нет системного шрифта Medium на iOS7, они добавили его в iOS 8.2. На iOS7, после долгого отставания, он выбирает первый шрифт в алфавитном порядке (Академия Гравировка).

Интересно, что шрифт 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

а системаFont является регулярной Helvetica Neue.

Обходной путь для iOS 7 заключается в том, чтобы выбрать шрифт System Bold в построителе интерфейса, он выглядит тоньше, когда он работает на устройстве iOS7, чем на построителе интерфейса. К сожалению, на iOS8 и iOS9 он действительно выглядит полужирным и не средним...

Я перешел на Helvetica-Neue Medium для тех случаев, которые, к сожалению, означают, что у меня есть несоответствие системного шрифта /San Francisco и Helvetica-Neue на некоторых моих экранах на iOS 9. Не могу дождаться, чтобы получить зеленый свет, чтобы отказаться от поддержки iOS7.

Ответ 2

Я использую метод 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 создатель:)

Ответ 3

проверьте номер версии, и если его менее 8 изменяет шрифт программно в вашем представленииDidLoad:

if !NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
    //change font
}