iOS 7 上的不同系统中字体
Different System Medium font on iOS 7
我正在像这样在故事板上设置 System Medium
字体:
这是 iOS 8
的结果:
但是 iOS 7
显示的是不同的(奇怪的)字体:
我是不是设置错了什么?
运行 关于这个问题也是如此,这是我的发现。这真是一团糟。
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
系统字体是常规的 Helvetica Neue。
iOS 7 的解决方法是在界面生成器中选择系统粗体字体,它在 iOS7 设备上 运行 确实比在界面上看起来更细建设者。不幸的是,在 iOS8 和 iOS9 上,它确实看起来很粗,而且不是中号...
我最终在这些情况下切换到 Helvetica-Neue Medium,不幸的是,这意味着我在 iOS 9 的某些屏幕上不匹配系统 font/San Francisco 和 Helvetica-Neue。
迫不及待地想要放弃对 iOS7.
的支持
检查版本号,如果版本号小于 8,则在您的 viewDidLoad 中以编程方式更改字体:
if !NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
//change font
}
我使用 method 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 的创建者:)
我正在像这样在故事板上设置 System Medium
字体:
这是 iOS 8
的结果:
但是 iOS 7
显示的是不同的(奇怪的)字体:
我是不是设置错了什么?
运行 关于这个问题也是如此,这是我的发现。这真是一团糟。
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
系统字体是常规的 Helvetica Neue。
iOS 7 的解决方法是在界面生成器中选择系统粗体字体,它在 iOS7 设备上 运行 确实比在界面上看起来更细建设者。不幸的是,在 iOS8 和 iOS9 上,它确实看起来很粗,而且不是中号...
我最终在这些情况下切换到 Helvetica-Neue Medium,不幸的是,这意味着我在 iOS 9 的某些屏幕上不匹配系统 font/San Francisco 和 Helvetica-Neue。 迫不及待地想要放弃对 iOS7.
的支持检查版本号,如果版本号小于 8,则在您的 viewDidLoad 中以编程方式更改字体:
if !NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
//change font
}
我使用 method 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 的创建者:)