sfprodisplay - Diferente fuente de System Medium en iOS 7
sf hello (3)
Corriendo en este problema también y estos son mis hallazgos. Esto es un verdadero desastre.
No hay fuente de sistema Medium en iOS7, lo agregaron en iOS 8.2. En iOS7, después de un largo retraso, está eligiendo la primera fuente en orden alfabético (grabado de la Academia).
Curiosamente, la fuente del sistema en negrita iOS 7 es en realidad una fuente Medium Helvetica Neue:
(lldb) po [UIFont boldSystemFontOfSize:12]
<UICTFont: 0x12c58f8b0> font-family: ".HelveticaNeueInterface-MediumP4"; font-weight: bold; font-style: normal; font-size: 12.00pt
y el systemFont es un Helvetica Neue regular.
La Solución para iOS 7 es elegir la fuente del Sistema Negrita en el constructor de interfaz, se ve más delgada cuando se ejecuta en un dispositivo iOS7 que en el constructor de interfaz. Desafortunadamente, en iOS8 e iOS9, realmente parece audaz y no medio ...
Terminé cambiando a Helvetica-Neue Medium para esos casos, lo que desafortunadamente significa que no coinciden las fuentes del sistema / San Francisco y Helvetica-Neue en algunas de mis pantallas en iOS 9. No puedo esperar a que la luz verde deje de funcionar. para iOS7.
compruebe el número de versión y si es menor que 8 cambie la fuente programáticamente en su viewDidLoad:
if !NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
//change font
}
Utilizo el método swizzling para solucionar este error de iOS 7. Mi enfoque funciona bien con 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
Un agradecimiento especial para el creador de Xtrace :)