2015-09-09 21 views
10

Sto installando un font System Medium su storyboard come questo:diverso sistema su iOS 7

enter image description here

E questo è il risultato per iOS 8:

enter image description here

Ma iOS 7 sta mostrando un diverso (strano) carattere:

enter image description here

Sto impostando qualcosa di sbagliato?

risposta

8

Correndo anche su questo problema e questo è il mio risultato. Questo è un vero casino.

Non c'è un carattere di sistema Medio su iOS7, è stato aggiunto in iOS 8.2. Su iOS7, dopo un lungo ritardo, sta selezionando il primo carattere in ordine alfabetico (Academy Engraved).

interessante il carattere di sistema grassetto IOS 7 è in realtà un font medio Helvetica Neue:

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

e SystemFont è un Helvetica Neue regolare.

La soluzione alternativa per iOS 7 è quella di selezionare il font System Bold nel generatore di interfacce, sembra più sottile quando è in esecuzione su un dispositivo iOS7 rispetto a quello sul generatore di interfacce. Sfortunatamente, su iOS8 e iOS9, sembra davvero audace e non medio ...

Ho finito per passare a Helvetica-Neue Medium per quei casi che, sfortunatamente, significa che ho una mancata corrispondenza di font di sistema/San Francisco e Helvetica-Neue in alcuni dei miei schermi su iOS 9. Non vedo l'ora di ottenere la luce verde per far cadere il supporto per iOS7.

0

controllo il numero di versione e se inferiore a 8 il cambiamento del carattere programmatico nel viewDidLoad:

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

Io uso il metodo swizzling per risolvere questo iOS 7 bug. Il mio approccio funziona bene 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 ringraziamento speciale per Xtrace s' creatore :)

+0

Questa dovrebbe essere la risposta accettata –