これは基本的に簡単なはずですが、何らかの理由で機能していません。 SOで同様の投稿を読みましたが、フォント特性辞書に問題があるようです。これは問題ですか、それとも完全に何かが足りないのですか?これは初めての混乱です。このようなフォントを使っているので、後者かもしれないと思います。
定数を使用したり、「-bold」バリアントのフォントを提供したりしたくありません。フォントの太さをきめ細かく制御したいのですが。
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を実行しています):
UIFontWeightTraitNSNumberオブジェクトとしての正規化された重み値。有効な値の範囲は-1.0〜1.0です。 0.0の値は、通常または中程度のフォントの太さに対応します。フォントの太さ定数を使用して、特定の太さを指定することもできます。使用できる定数のリストについては、フォントの重みを参照してください。 iOS 7.0以降で利用可能です。
UIFont(descriptor: imgFontDescriptor!, size: 24.0)
は、記述子と一致するフォントを返します。説明に一致するフォントが見つからない場合は、デフォルトのフォントが返されます。したがって、手動で体重を制御することはできません。使用するフォントによって異なります。フォントがその重みをサポートしている場合は、それを返します。
もう1つ、[UIFontDescriptorFamilyAttribute: "Helvetica"]
を使用する必要があります。したがって、FamilyNameとFontWeightに基づいてFontNameを決定します。
正しい方法は、Apple lib:
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の場合:
let traits = [UIFontWeightTrait: UIFontWeightLight] // UIFontWeightBold / UIFontWeightRegular
let imgFontDescriptor = UIFontDescriptor(fontAttributes: [UIFontDescriptorFamilyAttribute: "Helvetica"])
imgFontDescriptor = imgFontDescriptor.fontDescriptorByAddingAttributes([UIFontDescriptorTraitsAttribute: traits])
既存のfontDescriptor(たとえば既存のフォントから)を使用する場合、fontDescriptor.fontAttributesの明示的な「.name」属性のために機能しない可能性があります。
解決策、それは私のために働きます(Swift 4):
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)
}
}
使用法:
let baseFont = UIFont(name: "American Typewriter", size: 20)!
let boldFont = baseFont.bold
let semibold = baseFont.semibold
Swift 4.1の場合、次のようにします。
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)