使用自定义字体整个iOS应用程序swift

taw*_*eed 22 fonts ios swift

我知道要在屏幕上设置元素的自定义字体,我可以做到someLabel.font=UIFont(name: "Exo 2.0", size: 15).

我想知道如何使用swift为整个应用程序设置它.(一个hack就是对应用程序的每个元素做我所知道的但这只是一个可维护性的噩梦)

我看到这个问题已经被问到了一个Objective-C标签,如何在不指定大小的情况下为整个iOS应用程序设置自定义字体但我对Objective-C不够熟悉,足以将代码移植到swift

Chr*_*örz 32

您可以设置UILabel和其他UIViews的外观:

UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)
Run Code Online (Sandbox Code Playgroud)

更多一般:

AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize)
Run Code Online (Sandbox Code Playgroud)

  • 我的问题是,如果我实现这一点,字体大小也将超过?怎么避免这个? (36认同)
  • [this](http://stackoverflow.com/a/40484460/933770)非常适合不覆盖字体大小! (2认同)
  • 有没有办法在不指定大小的情况下像这样全局设置字体?因此,如果我有一个带有字幕样式的表格单元格,那么文本仍会以我选择的字体显示这些样式的默认大小? (2认同)

Mos*_*ani 17

作为更详细的答案和这些好处,我建议使用扩展:

  • 没有尺寸覆盖(无论你在设计师中设置的是什么)
  • 没有样式覆盖(Bold,Light,Medium,UltraLight在我的代码中实现,但您可以根据需要自定义)
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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用扩展程序的示例:

例如,将这些行放在启动控制器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
Run Code Online (Sandbox Code Playgroud)

正如@Christian所提到的那样,你可以为几乎AnyUIView编写自己的扩展

  • 这对于iOS 11和Swift 4仍然有效吗?我在UILabel中没有获得self.font.fontName的信息 (2认同)
  • 更新:您必须将@objc添加到substituteFontName以保持与swift4的兼容性 (2认同)
  • 如何使用相同的概念全局替换属性文本字体? (2认同)

Rma*_*moe 5

终于明白了这一点。我能找到的最干净的方法。(Swift 4) 解决方案不需要您设置字体大小,也不会覆盖所有字体大小。

  UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFontTextStyle(rawValue: "Roboto"))
Run Code Online (Sandbox Code Playgroud)

对于那些寻找放置此代码的位置的人。我把它放在我的 AppDelegate.swift 文件中

 func application(_ application: UIApplication, 
 didFinishLaunchingWithOptions...
Run Code Online (Sandbox Code Playgroud)

斯威夫特 4.2

 UILabel.appearance().font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle(rawValue: "Roboto"))
Run Code Online (Sandbox Code Playgroud)

  • 似乎不适用于带有 Swift 4.2 的 iOS 12,大多数文本的字体大小都变小了。 (4认同)