【问题标题】:get font-weight of an uitextview获取 uitextview 的字体粗细
【发布时间】:2018-01-10 18:26:52
【问题描述】:

我想调整一些 UITextView 中的字体大小。这适用于插座集合和此代码:

for (UITextView *view in self.viewsToResize) {
  if ([view respondsToSelector:@selector(setFont:)]) {
     [view setFont:[UIFont systemFontOfSize:view.font.pointSize + 5]];
  }
}

但我的问题是,并非每个 textView 都以正常重量使用 systemFont,其中一些是粗体。是否有可能获得字体粗细?在调试区域使用po view.font,我可以看到我需要的一切:

$11 = 0x0c596ea0 <UICFFont: 0xc596ea0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 12px

但是如何访问字体粗细?

为粗体视图使用第二个插座集合可以解决我的问题。但我想知道我没有发现任何东西只能得到字体粗细。

【问题讨论】:

    标签: ios objective-c uitextview uifont


    【解决方案1】:

    我已经弄清楚了如何获得字体粗细,你必须深入了解核心文本:

            let ctFont = font as CTFont
            let traits = CTFontCopyTraits(ctFont)
            let dict = traits as Dictionary
    
            if let weightNumber = dict[kCTFontWeightTrait] as? NSNumber {
                print(weightNumber.doubleValue)
            }
    

    享受吧!

    【讨论】:

    • 谢谢!在 Objective-C 中获取特征 dict 的一种方法:NSDictionary *traits = (__bridge NSDictionary*)CTFontCopyTraits((CTFontRef)someFont);
    • if (font.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold) // 检查没有核心文本的字体粗细
    【解决方案2】:

    UIFont 没有粗体/斜体/... 属性,因此您只能依赖字体名称。 如果您不知道将使用哪些字体,这将是一个问题。

    如果您知道您将使用例如。只有 Helvetica 你可以试试这个:

    UIFont *font = textview.font;
    if([font.fontName isEqualToString:@"Helvetica-Bold"])
        NSLog(@"It's Bold!");
    

    或者,您可以在 font.fontName 中搜索“bold”/“medium”/“light”等词,但这并不能保证您会从每种可用字体中获得一些东西:

    if ([font.fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location == NSNotFound) {
      NSLog(@"font is not bold");
    } else {
      NSLog(@"font is bold!");
    }
    // if font.fontName contains "medium"....
    // if font.fontName contains "italic"....
    

    检查http://iosfonts.com/ 以获取可用的字体名称。

    【讨论】:

    • 字体描述包含字体粗细的细节检查这个 [[font.description componentsSeparatedByString:@"font-weight:"][1] componentsSeparatedByString:@";"][0] 假设苹果不会改变字体说明
    【解决方案3】:

    但我的问题是,并非每个 textView 都使用 systemFont 正常重量,其中一些是粗体。

    如果你想使用粗体系统字体,那么你可以简单地使用

    [UIFont boldSystemFontOfSize:15.0]; 
    

    但是,我仍在考虑需要使用font-weight 的特殊情况。

    更新:

    UIFont 类中没有可以直接获取font-weight 的内容。你可以看看UIFont Class Reference

    您唯一能做的就是获取font-name 并尝试找出字体名称中的“粗体”子字符串。如果找到任何匹配,则意味着该特定字体的font-weight 是“粗体”。

    但是,这仍然不是最有效的方法。

    【讨论】:

    • 是的,没错。 ;) 但是要决定,如果我必须使用systemFontOfSizeboldSystemFontOfSize,我必须知道我当前视图中的字体粗细。
    • @mjay :我没有得到你。如果你想以“粗体”显示一些字体,那么你可以使用boldSystemFontOfSize,否则你可以使用systemFontOfSize。在您的情况下,这个“字体粗细”来自哪里?
    • 搜索“粗体”字符串是一种解决方案,但您是对的 - 这不是最好的方法。我现在正在使用第二个插座集合和第二个循环用于粗体字体的视图。你的回答很好,但是 N D 有点快(而且他需要声誉;)),所以我会接受他的回答。
    【解决方案4】:

    您可以使用 fontDescriptor 方法获取字体的 UIFontDescriptor。然后获取 UIFontDescriptor 的 fontAttributes 字典,从返回另一个字典的字典中获取 UIFontDescriptorTraitsAttribute,然后从该字典中读取 UIFontWeightTrait。未测试。

    现在经过测试:不起作用。 fontAttributes 总是返回一个字典,其中包含字体名称和字体大小的两个键,仅此而已。我想“这不起作用”也是一个答案,当某些东西应该根据文档工作时......

    您可以尝试 symbolicTraits,但这也没什么用:只有当整个字体系列都是粗体时,它才会返回“粗体”。

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 2021-01-27
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2014-10-04
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多