2015-09-09 13 views

Antwort

8

Laufen auf dieses Problem auch und das ist meine Ergebnisse. Das ist ein echtes Durcheinander.

Es gibt keine Medium System Schriftart auf iOS7, sie fügten es in iOS 8.2 hinzu. Auf iOS7 wird nach einer langen Verzögerung die erste Schriftart in alphabetischer Reihenfolge (Academy Engraved) ausgewählt.

Interessanterweise ist das iOS 7 fett Systemschriftart ein Medium Helvetica Neue Schrift tatsächlich:

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

und die Systemfont ist eine regelmäßige Helvetica Neue. Die Problemumgehung für iOS 7 besteht darin, die Schriftart "System Bold" im Interface Builder auszuwählen. Sie sieht auf einem iOS7-Gerät schlanker aus als auf dem Interface-Builder. Leider sieht es auf iOS8 und iOS9 wirklich fett aus und nicht mittel ...

Ich bin auf Helvetica-Neue Medium für die Fälle gewechselt, was unglücklicherweise bedeutet, dass ich eine falsche Systemschrift/San Francisco und Helvetica-Neue habe in einigen meiner Bildschirme auf iOS 9. Kann nicht warten, um das grüne Licht zu bekommen, um Unterstützung für iOS7 fallen zu lassen.

0

überprüfen Sie die Versionsnummer und wenn ihr weniger als 8 Änderung der Schrift programmatisch in Ihrem viewDidLoad:

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

Ich benutze Methode Swizzling dieses iOS 7 Fehler zu beheben. Mein Ansatz funktioniert gut mit 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 

Besonderer Dank für Xtrace ‚s Schöpfer :)

+0

Dies sollte die akzeptierte Antwort sein –

Verwandte Themen