web-dev-qa-db-ja.com

iOS Swiftフォント記述子にカスタムウェイトを追加

これは基本的に簡単なはずですが、何らかの理由で機能していません。 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 8ではnilを返します

https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIFontDescriptor_Class/#//Apple_ref/doc/constant_group/Font_Traits_Dictionary_Keys

IOSのドキュメントによると、数値を使用すると機能するはずです(iOS 9.2を実行しています):

UIFontWeightTraitNSNumberオブジェクトとしての正規化された重み値。有効な値の範囲は-1.0〜1.0です。 0.0の値は、通常または中程度のフォントの太さに対応します。フォントの太さ定数を使用して、特定の太さを指定することもできます。使用できる定数のリストについては、フォントの重みを参照してください。 iOS 7.0以降で利用可能です。

13
Tim Sanders

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])
13
Huy Le

既存の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
8
Andrey

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)
6
Ely