web-dev-qa-db-ja.com

iOSアプリ全体にカスタムフォントを使用するswift

画面上の要素のカスタムフォントを設定するには、単にdosomeLabel.font=UIFont(name: "Exo 2.0", size: 15)できることを知っています。

私はSwiftを使用してアプリ全体にどのように設定できるのか疑問に思っていました。 (ハックは、アプリのすべての要素について私が知っていることを行うことですが、それは保守性の悪夢になります)

この質問はすでにObjective-Cタグで尋ねられていることがわかります サイズを指定せずにiOSアプリ全体にカスタムフォントを設定する方法 Swiftへのコード

20
tawheed

UILabelおよびその他のUIViewの外観を設定できます。

UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)

より一般的な:

AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize)
31
Christian Wörz

より詳細な答えとして、これらの利点を備えた拡張機能の使用をお勧めします。

  • サイズのオーバーライドなし(デザイナーで設定したものが使用されます)
  • スタイルのオーバーライドはありません(太字、ライト、ミディアム、ウルトラライトはコードに実装されていますが、必要に応じてカスタマイズできます)
import UIKit

extension UILabel {
    public var substituteFontName : String {
        get {
            return self.font.fontName;
        }
        set {
            let fontNameToTest = self.font.fontName.lowercased();
            var fontName = newValue;
            if fontNameToTest.range(of: "bold") != nil {
                fontName += "-Bold";
            } else if fontNameToTest.range(of: "medium") != nil {
                fontName += "-Medium";
            } else if fontNameToTest.range(of: "light") != nil {
                fontName += "-Light";
            } else if fontNameToTest.range(of: "ultralight") != nil {
                fontName += "-UltraLight";
            }
            self.font = UIFont(name: fontName, size: self.font.pointSize)
        }
    }
}

extension UITextView {
    public var substituteFontName : String {
        get {
            return self.font?.fontName ?? "";
        }
        set {
            let fontNameToTest = self.font?.fontName.lowercased() ?? "";
            var fontName = newValue;
            if fontNameToTest.range(of: "bold") != nil {
                fontName += "-Bold";
            } else if fontNameToTest.range(of: "medium") != nil {
                fontName += "-Medium";
            } else if fontNameToTest.range(of: "light") != nil {
                fontName += "-Light";
            } else if fontNameToTest.range(of: "ultralight") != nil {
                fontName += "-UltraLight";
            }
            self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17)
        }
    }
}

extension UITextField {
    public var substituteFontName : String {
        get {
            return self.font?.fontName ?? "";
        }
        set {
            let fontNameToTest = self.font?.fontName.lowercased() ?? "";
            var fontName = newValue;
            if fontNameToTest.range(of: "bold") != nil {
                fontName += "-Bold";
            } else if fontNameToTest.range(of: "medium") != nil {
                fontName += "-Medium";
            } else if fontNameToTest.range(of: "light") != nil {
                fontName += "-Light";
            } else if fontNameToTest.range(of: "ultralight") != nil {
                fontName += "-UltraLight";
            }
            self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17)
        }
    }
}

拡張機能を使用するためのサンプル:

例えばこれらの行を開始コントローラーviewDidLoadに入れます

    UILabel.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD
    UITextView.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD
    UITextField.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD

追伸@Christianが言及したように、ほとんどAnyUIViewの独自の拡張機能を書くことができます

16

最終的にこれを理解しました。私が見つけることができる最もきれいな方法。 (Swift 4)ソリューションでは、フォントサイズを設定する必要がなく、すべてのフォントサイズを上書きしません。

  UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFontTextStyle(rawValue: "Roboto"))

このコードを配置する場所を探している人向け。 AppDelegate.Swiftファイル内に配置します

 func application(_ application: UIApplication, 
 didFinishLaunchingWithOptions...

Swift 4.2

 UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle(rawValue: "Roboto"))
2
Rmalmoe

Swift 4 with iOS 11で同じことを行う方法を見つけました

変数名の前に@objcキーワードのみを追加する必要があります。したがって、変数宣言は次のようになります

@objc public var substituteFontName : String {
    get {}
    set {}
}

これがこの問題に直面している他の人を助けることを願っています。

1
Surjeet