欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

iOS 中字母 I(大写 i)和 l(小写 L)无法区分的问题

最编程 2024-05-01 10:05:57
...
开源中国社区团队直播首秀,以分享为名讲述开源中国社区背后的故事”

昨天被自动生成的密码坑了一次,其中的字母l(L的小写)我以为是I(i的大写),导致验证一直不通过,浪费了大量时间。其实我刚刚发现,写这篇文章标题时同样也没办法好好区分.

在iOS中,这种问题多出现在无衬线字体上,有衬线字体则很少出现这个问题。从iOS9以来,苹果的英文字体默认使用的是 San Francisco 字体,它就存在这种无法区分的问题。幸运的是,针对这个默认字体苹果也提供了解决方案,那就是使用 high-legibility 这个替换风格集,使用后就能够有效区分诸如大写 i 及小写 L、零及 O 等相似字母。

实现代码1:

UIFont *font0 = [UIFont systemFontOfSize:14]; //[UIFont fontWithName:@"SanFranciscoText-Light" size:14];
    UIFontDescriptor *fontDesc = font0.fontDescriptor;
    
    NSDictionary *retVal = nil;
    BOOL featureTristate = YES;
    retVal =
    @{
      UIFontFeatureTypeIdentifierKey     : @(kStylisticAlternativesType),
      UIFontFeatureSelectorIdentifierKey : featureTristate ? @(kStylisticAltSixOnSelector) :
          @(kStylisticAltSixOffSelector)
      };
    NSDictionary* featureAttribute = @{ UIFontDescriptorFeatureSettingsAttribute : @[retVal] };

    UIFontDescriptor *fontDescNew = [fontDesc fontDescriptorByAddingAttributes:featureAttribute];

    UIFont *font = [UIFont fontWithDescriptor:fontDescNew size:14];

实现代码2:

SFFontFeatureTraits *traits = [[SFFontFeatureTraits alloc] init];
    traits.highLegibility = on;
    UIFont *font = [UIFont systemFontOfSize:14];
    font = [font fontWithTraits:[SFFontFeatureTraits traitsWithHighLegibilityEnabled]];

这个是基于 djfitz/SFFontFeatures: Easily use cool, hidden typographic features of the San Francisco font in your app! 实现的。

参考:

  • iOS 9 字体中的大写I(i)和小写l(L)完全无法区分,苹果怎么能允许这样的事情发生? - 知乎
  • 有什么字体可以区分l1I? - 知乎
  • 为什么很多英文字体中小写的L和大写的i看起来是一样的
  • IOS字体San Francisco - 阅读 - 掘金
  • San Francisco:苹果新字体的秘密 - 简书