首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift中向iOS字体描述符添加自定义权重

在Swift中向iOS字体描述符添加自定义权重
EN

Stack Overflow用户
提问于 2016-01-04 03:16:03
回答 6查看 19.3K关注 0票数 16

这看上去应该很简单,但不管出于什么原因,它都是行不通的。我看过类似的文章,似乎字体特征词典有问题吗?这是个问题还是我完全错过了什么?这是我第一次使用这样的字体,所以我想可能是后者。

我不想使用常量,也不想提供带有"-bold“变体的字体。我想对字体的重量进行精细的控制。

代码语言:javascript
复制
let traits = [UIFontWeightTrait : 1.0]
imgFontDescriptor = UIFontDescriptor(fontAttributes: [UIFontDescriptorNameAttribute: "Helvetica"])
imgFontDescriptor = imgFontDescriptor.fontDescriptorByAddingAttributes([UIFontDescriptorTraitsAttribute:traits])
imgTextFont = UIFont(descriptor: imgFontDescriptor!, size: 24.0)

研究:

根据iOS文档,使用数字值应该可以工作(我正在运行iOS 9.2):

UIFontWeightTrait 作为NSNumber对象的归一化权重值。有效值范围为-1.0至1.0。0.0的值对应于常规或中等字体的重量。还可以使用字体权重常量来指定特定的权重;有关可以使用的常量列表,请参见字体权重。可在iOS 7.0及更高版本中获得。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-01-04 05:25:09

UIFont(descriptor: imgFontDescriptor!, size: 24.0)正在返回一个与描述符匹配的字体。如果无法找到与您的描述匹配的字体,则返回默认字体。因此,你不能手动控制你的体重。这取决于你使用的字体。如果字体支持该重量,它将返回该重量。

还有一件事,您应该使用[UIFontDescriptorFamilyAttribute: "Helvetica"]。因此,它将基于FontName &您的FontWeight确定FamilyName。

正确的方法是使用Apple中的常量:

代码语言:javascript
复制
public let UIFontWeightUltraLight: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightThin: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightLight: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightRegular: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightMedium: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightSemibold: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightBold: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightHeavy: CGFloat
@available(iOS 8.2, *)
public let UIFontWeightBlack: CGFloat*/

您应该使用http://iosfonts.com/来确定该姓氏所支持的字体权重。

就Helvetica而言:

代码语言:javascript
复制
let traits = [UIFontWeightTrait: UIFontWeightLight] // UIFontWeightBold / UIFontWeightRegular
let imgFontDescriptor = UIFontDescriptor(fontAttributes: [UIFontDescriptorFamilyAttribute: "Helvetica"])
imgFontDescriptor = imgFontDescriptor.fontDescriptorByAddingAttributes([UIFontDescriptorTraitsAttribute: traits])
票数 16
EN

Stack Overflow用户

发布于 2018-03-19 19:31:01

如果您使用现有的fontDescriptor (例如,从现有字体中使用),由于fontDescriptor.fontAttributes中显式的'.name‘属性,它可能无法工作。

解决方案,适用于我(Swift 4):

代码语言:javascript
复制
extension UIFont {
    var bold: UIFont { return withWeight(.bold) }
    var semibold: UIFont { return withWeight(.semibold) }

    private func withWeight(_ weight: UIFont.Weight) -> UIFont {
        var attributes = fontDescriptor.fontAttributes
        var traits = (attributes[.traits] as? [UIFontDescriptor.TraitKey: Any]) ?? [:]

        traits[.weight] = weight

        attributes[.name] = nil
        attributes[.traits] = traits
        attributes[.family] = familyName

        let descriptor = UIFontDescriptor(fontAttributes: attributes)

        return UIFont(descriptor: descriptor, size: pointSize)
    }
}

用法:

代码语言:javascript
复制
let baseFont = UIFont(name: "American Typewriter", size: 20)!
let boldFont = baseFont.bold
let semibold = baseFont.semibold
票数 24
EN

Stack Overflow用户

发布于 2018-05-19 22:17:32

使用Swift 4.1,只需这样做:

代码语言:javascript
复制
var descriptor = UIFontDescriptor(name: "Helvetica Neue", size: 24.0)
descriptor = descriptor.addingAttributes([UIFontDescriptor.AttributeName.traits : [UIFontDescriptor.TraitKey.weight : UIFont.Weight.light]])
let font = UIFont(descriptor: descriptor, size: 24.0)
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34584234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档