添加自定义字体作为字体类型 SwiftUI 的扩展

Arn*_*ani 7 fonts swift swiftui

首先要明确的是,我不是在问如何向 SwiftUI 添加自定义字体,而是在问如何使用自定义字体扩展 Font 类型。

例如,我使用自定义字体Manrope。我将 ttf 文件添加到我的项目中,并将其添加到我的信息 plist 中。目前我必须使用这样的字体:

.font(.custom("Manrope-SemiBold", size: 24))
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以扩展 Font,以便我可以像这样使用 Manrope

.font(.manrope.semibold())
Run Code Online (Sandbox Code Playgroud)

或者

.font(.manrope("Semibold"))
Run Code Online (Sandbox Code Playgroud)

Raj*_*han 15

使用枚举来表示多种字体类型,并使用函数来设置自定义字体。

这是一个可能的解决方案

//MARK: Font Extension
extension Font {
    enum ManropeFont {
        case semibold
        case custom(String)
        
        var value: String {
            switch self {
            case .semibold:
                return "Semibold"
                
            case .custom(let name):
                return name
            }
        }
    }
    
    enum RobotoFont {
        case semibold
        case custom(String)
        
        var value: String {
            switch self {
            case .semibold:
                return "Semibold"
                
            case .custom(let name):
                return name
            }
        }
    }
    
    static func manrope(_ type: ManropeFont, size: CGFloat = 26) -> Font {
        return .custom(type.value, size: size)
    }
    
    static func roboto(_ type: RobotoFont, size: CGFloat = 26) -> Font {
        return .custom(type.value, size: size)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

struct ContentViewFonts: View {
    var body: some View {
        VStack {
            Text("Text demo")
                .font(.manrope(.semibold))
            
            Text("Text demo")
                .font(.roboto(.semibold))
            
            Text("Text demo")
                .font(.roboto(.semibold, size: 10))
            
            Text("Text demo")
                .font(.roboto(.custom("Bold")))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


LuL*_*aGa 7

您可以将自定义字体声明为 Font 上的静态计算属性:

extension Font {
    
    static var myCustomFont: Font {
        Font.custom("Manrope-SemiBold", size: 24)
    }
    
}
Run Code Online (Sandbox Code Playgroud)

或者甚至更好地像这样支持动态类型:

extension Font {

    static var myCustomFont: Font {
        Font.custom("Manrope-SemiBold", size: 24, relativeTo: .title2)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以像预定义系统字体一样使用它:

Text("Example")
    .font(.myCustomFont)
Run Code Online (Sandbox Code Playgroud)