来自故事板的用户或以编程方式将字体粗细设置为常规,半粗体等。
我想读取任何字体标签的重量。
我尝试setValue
并且font-weight就在那里但是没有公开的变量来从字体中获得权重。
有可能吗?
答案 0 :(得分:4)
要获取字体粗细字符串名称,请使用字体描述符并传入面部属性。
Swift 4.2
let font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.bold)
let face = font.fontDescriptor.object(forKey: UIFontDescriptorFaceAttribute) as! String
print("face: \(face)")
Swift 3
let font = UIFont.systemFont(ofSize: 14, weight: UIFontWeightBold)
let face = font.fontDescriptor.object(forKey: UIFontDescriptorFaceAttribute) as! String
print("face: \(face)")
答案 1 :(得分:4)
尝试使用Swift 4进行以下示例字体扩展。(它需要对所有类型的字体权重进行一些改进)
extension UIFont {
func getFontWeight() -> UIFont.Weight {
let fontAttributeKey = UIFontDescriptor.AttributeName.init(rawValue: "NSCTFontUIUsageAttribute")
if let fontWeight = self.fontDescriptor.fontAttributes[fontAttributeKey] as? String {
switch fontWeight {
case "CTFontBoldUsage":
return UIFont.Weight.bold
case "CTFontBlackUsage":
return UIFont.Weight.black
case "CTFontHeavyUsage":
return UIFont.Weight.heavy
case "CTFontUltraLightUsage":
return UIFont.Weight.ultraLight
case "CTFontThinUsage":
return UIFont.Weight.thin
case "CTFontLightUsage":
return UIFont.Weight.light
case "CTFontMediumUsage":
return UIFont.Weight.medium
case "CTFontDemiUsage":
return UIFont.Weight.semibold
case "CTFontRegularUsage":
return UIFont.Weight.regular
default:
return UIFont.Weight.regular
}
}
return UIFont.Weight.regular
}
尝试使用标签:
let label = UILabel()
var fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.bold)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.black)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.heavy)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.ultraLight)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.thin)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.light)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.medium)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
label.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.semibold)
fontWeight = label.font.getFontWeight()
print("fontWeight - \(fontWeight)")
以下是Font Weights
列表的Apple文档此权重的值是NSNumber对象。有效值范围是 -1.0到1.0 。值0.0对应于常规或中等字体粗细。您还可以使用字体粗细常量来指定特定的权重。
答案 2 :(得分:2)
似乎没有直接的方式来获得它。作为一种解决方法,您可以获得如下字体重量的指示:
let labelFont = label.font as CTFont
if let fontTraits = CTFontCopyTraits(labelFont) as? [CFString: CFNumber], let fontWeight = fontTraits[kCTFontWeightTrait] {
print(fontWeight)
}
UIFont已投放为CTFont,生成包含CTFontCopyTraits(_:)
值的CFDictionary(使用kCTFontWeightTrait)。请注意,它不是什么是确切的字体重量,但它可能在某种程度上有助于指示重量:
从字体特征访问标准化体重特征的关键 字典。 返回的值是表示浮点数的CFNumber 标准化重量的值在-1.0和1.0之间。值0.0 对应于常规或中等字体粗细。
答案 3 :(得分:1)
您可以使用字体的符号特征:
// is true when font is bold
label.font.fontDescriptor.symbolicTraits.contains(UIFontDescriptorSymbolicTraits.traitBold)
检查docs是否有更多特征。
答案 4 :(得分:1)
似乎fontDescriptor.fontAttributes
不会返回 all 字体的属性。幸运的fontDescriptor.object(forKey: .traits)
可以,所以我们可以跳上它。
extension UIFont {
var weight: UIFont.Weight {
guard let weightNumber = traits[.weight] as? NSNumber else { return .regular }
let weightRawValue = CGFloat(weightNumber.doubleValue)
let weight = UIFont.Weight(rawValue: weightRawValue)
return weight
}
private var traits: [UIFontDescriptor.TraitKey: Any] {
return fontDescriptor.object(forKey: .traits) as? [UIFontDescriptor.TraitKey: Any]
?? [:]
}
}
然后就像label.font.weight
(从根本上等效于https://stackoverflow.com/a/48688000/1288097,但它使用UIKit
API)